ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-06-25

[][][][]関数の引数に複数のハッシュを指定する場合はリファレンスを使う 11:47 関数の引数に複数のハッシュを指定する場合はリファレンスを使う - ishiducaの日記 を含むブックマーク はてなブックマーク - 関数の引数に複数のハッシュを指定する場合はリファレンスを使う - ishiducaの日記 関数の引数に複数のハッシュを指定する場合はリファレンスを使う - ishiducaの日記 のブックマークコメント

入社日から任意の日付(例えば、今日)までで満何年かを調べるのに一度日付をハッシュに直して計算するようにした。

たとえば、"2009/06/25" は "( 'year' => 2009, 'month' => 6, 'date' => 25 )" のように。

ハッシュに直すのは、後日色々な日付計算をするかもしれないと思ったためで、その方が扱いやすいと思ったから。


さて、本題。

一つのハッシュを引数に渡すなら、そのまま渡しても問題ない。

my %date = ( 'year' => 2009, 'month' => 6, 'date' => 25 );
print &format(%date);

sub format{
    my %d = @_;
    sprintf "%04d-%02d-%02d", $d{'year'}, $d{'month'}, $d{'date'};
}

しかし、複数のハッシュを渡す場合、そのまま渡しても受け取るサブルーチン側で、一つの @_ に格納してしまう。

my(%hash_a, %hash_b) = @_;

とか

my %hash_a = shift;
my %hash_b = shift;

では期待した結果にならない。渡されたハッシュのキーと値を交互にした配列が @_ に渡され、それを最初の引数の %hash_a に渡して、展開してしまう。

my %date = ( 'year' => 2009, 'month' => 6, 'date' => 25 );
my %time = ( 'hour' => 10, 'minute' => 10, 'sec' => 22 );
print &test(%date,%time);

sub test{
    my(%d,%t) = @_;
    return $d{'sec'};
    # 22 がかえる
    # return $t('set');
    # とすると "Use of uninitialized value in print at ..."とエラーを吐く
}

なので、直接配列を渡すのではなく、リファレンスのリストを渡すのがポピュラー

my %date_small = (
    'year'  => 2008,
    'month' => 10,
    'date'  => 9,
);
my %date_large = (
    'year'  => 2009,
    'month' => 6,
    'date'  => 25,
);

print &Years(\%date_small,\%date_large);
exit 0;

sub Years{
    my $S = shift;
    my $L = shift;
    my $year = $L{'year'} - $S{'year'};
    $year-- if $S{'month'} > $L{'month'};
    $year-- if $S{'month'} == $L{'month'} and $S{'date'} > $L{'date'};
    return $year;
}

むしろ、日付オブジェクトを生成するとか、日付計算に使えるモジュールを使う方がPerl使いに取っての正解だと思うんだけど、標題の「関数の引数に複数のハッシュを使う」方法の習得になりそうだったので、今回は敢えて「無駄」をしてみた。


んな訳で、満何年かを調べるスクリプト

get_year.pl

t

リファクタリングしたい

DashDash2011/10/10 12:42Your article perfectly shows what I needed to know, tnhaks!

isbentyyowlisbentyyowl2011/10/10 18:32bNeKLH <a href="http://penkuwxjpjyb.com/">penkuwxjpjyb</a>

phslmuuhphslmuuh2011/10/12 02:06ZjXfZ1 , [url=http://napedayzihvv.com/]napedayzihvv[/url], [link=http://ijommnclvhrk.com/]ijommnclvhrk[/link], http://ntcebrpashsh.com/

wwpbswoawwpbswoa2011/10/13 23:38XwQx2I <a href="http://zocjzpqmtbcf.com/">zocjzpqmtbcf</a>

jdthwfffmmjdthwfffmm2011/10/14 19:57rO5PUb , [url=http://tmuypkupwzly.com/]tmuypkupwzly[/url], [link=http://xenmuwpxnwow.com/]xenmuwpxnwow[/link], http://xmpageqkljmw.com/

RaniRani2012/11/01 18:42I can't hear anything over the sound of how aeswome this article is.

gvelconaefhgvelconaefh2012/11/02 10:04fAXQ4u <a href="http://kxzofmhmaqrd.com/">kxzofmhmaqrd</a>

zgpobuzgpobu2012/11/02 14:40lSNt9m , [url=http://otnqpcouctww.com/]otnqpcouctww[/url], [link=http://hgwekhrbxogs.com/]hgwekhrbxogs[/link], http://shvfahutlsjm.com/

ktrioksqcktrioksqc2012/11/04 23:18FOVZJJ <a href="http://fzfmfvxsbdhf.com/">fzfmfvxsbdhf</a>

fzjnrzamfzjnrzam2012/11/05 12:38Yqnnj5 , [url=http://hgfpsadaybiw.com/]hgfpsadaybiw[/url], [link=http://stywutofmhtg.com/]stywutofmhtg[/link], http://mzvxzsxifzhy.com/

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090625