よし。

my $today = DateTime->now(time_zone => "local")->truncate(to => "month");
my @ month_lastday_do_not_31 = grep {31 != $today->clone->set_month($_)->add(days => 30)->day} (1 .. 12);
say @ month_lastday_do_not_31;

246911
末尾の11→十一→士→侍(さむらい)

【解説】
変数todayと言っときながら月頭を設定<おい
現在日時(タイムゾーンはローカル、tokyo/japanだっけ)から月まで切り詰め(日時分秒が初期値)
1月から12月までを1月ずつ
月頭をコピーして月を設定し直して各月の1日にして30日足した日付が31日か見る。
月末が30日なら30日足すと翌月に行ってしまい日付が1日(以降)になる。
日付が31日になる月だけ選抜して配列に入れて表示。
配列の表示は裸のままなので要素間にスペースが入らない。
配列をダブルクォーテーションで囲むとスペースが入る。

よくあるチョンボ
clone忘れて元のオブジェクトをドンドン書き替えてしまい、「あれ、今月の月頭だろ?」と思ってたらset_monthでtodayが12月の月頭になってる。
DateTimeの変更するメソッドは元のオブジェクトを変更して元のオブジェクトを返すことに注意。

フォロー

月末知りたいケースはあると思ったら関数あった。

ログインして会話に参加
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。