この人頭いいなと思ったエピソード

Calendar::Japanese::Holiday を利用して以下の様な祝日判定のルーチンをテストしているのですが、なぜか#(1)あるいは#(2)のようにサブルーチン内部で値を明示してやらないと正常動作(祝日判定)しません。
そこでCalendar::Japanese::HolidayのisHolidayルーチンの方に値が正常に渡っていないのかと考え、#(3)のようなチェック用のソースを組み入れてみたりもしたのですが、$year, $mon, $dayそれぞれ正常に値は渡っていました。
どのようにすれば正常動作するようになるのでしょうか?


my %spdate = (#すでに$y、$m、$dにはそれぞれ2012、05、05と値が入っています。
'year' =>$y,
'month' =>$m,
'day' =>$d,
);
$spdate = \%spdate;

&check_date($spdate);

sub &check_date{
my($spdate) = @_;

#($spdate->{year},$spdate->{month},$spdate->{day})=(2012,05,05); #(1)
#my $jpholiday = isHoliday(2012,05,05); #(2)

my $jpholiday = isHoliday($spdate->{year},$spdate->{month},$spdate->{day});

if($jpholiday){ push(@error, 'It is a holidays today'); }

}#end



#Calendar::Japanese::Holiday
#http://search.cpan.org/~kztomita/Calendar-Japane …
sub isHoliday {
my ($year, $mon, $day, $furikae) = @_;

#test #(3)
print "Content-type: text/html; charset=utf8\n\n";
print "$year";
print "$mon";
print "$day";

my $holidays;

if ($year == $Cache_holidays_Year &&
$mon == $Cache_holidays_Month) {
$holidays = $Cache_holidays;# From Cache
} else {
$holidays = getHolidays($year, $mon, 1);
return if not defined $holidays;
# Cache
$Cache_holidays = $holidays;
$Cache_holidays_Year = $year;
$Cache_holidays_Month = $mon;
}

return if !exists $holidays->{$day};

return if (!$furikae && $holidays->{$day} eq $FurikaeStr);

return $holidays->{$day};
}#end

A 回答 (4件)

my $jpholiday = isHoliday($spdate->{year}+0,$spdate->{month}+0,$spdate->{day}+0);


か?
    • good
    • 0
この回答へのお礼

これでOKでした。2012, 05, 05のまま渡しても正常に動作する様になりました。
ありがとうございました。

お礼日時:2012/05/02 10:42

なるほど、数値じゃなくて文字列が渡っているからアウトなんですね。



たぶん動く↓
# 全角スペース注意
my $spdate = {
  year => $q->param('year') + 0,
  month => $q->param('month') + 0,
  day  => $q->param('day')  + 0
};
    • good
    • 0
この回答へのお礼

ありがとうございます。この段階での処理でも2012, 05, 05のまま渡しても正常に動作しました。

お礼日時:2012/05/02 10:45

もしかして : chomp

    • good
    • 0
この回答へのお礼

chompは改行コードの削除ということでこの場合はあてはまりませんでしたが、私も最初にこれを疑いました。

お礼日時:2012/05/02 10:48

sub &check_date


はおかしくないか?

さておき, 最初の
「すでに$y、$m、$dにはそれぞれ2012、05、05と値が入っています。」
のところ, どうやって値を入れたんでしょうか?

また, 入っている値が
2012, 05, 05
ではなく
2012, 5, 5
だったらどうなりますか?

この回答への補足

>sub &check_date
これはこの質問記載中ののみの誤記載で実際には「sub check_date」となっています。紛らわしくて申し訳ないです。

$y、$m、$dにはプルダウンHTMLからの入力です。他の箇所との絡みで1~9の数字は05のようにあたまに0をつけた2けた数値でやり取りしています。

$y、$m、$dの数値を2012, 5, 5としたら正常に動作しました。

補足日時:2012/05/01 17:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!