Perl: ハッシュの中のサブルーチン
任意のキーによって処理内容自体を変えたい場合、if 文の連鎖よりもハッシュを使ったほうがエレガントだ。
単純な処理なら、無名サブルーチンでよい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/env perl use strict; use warnings; my %comp = ( 'eq' => sub { return $_ [0] == $_ [1] }, # equality 'lt' => sub { return $_ [0] < $_ [1] }, # less than 'le' => sub { return $_ [0] <= $_ [1] }, # less than or equal to ); for my $op ( 'eq' , 'lt' , 'le' ) { for my $x (1 .. 3) { print "$x $op 2: " , $comp { $op }( $x , 2) ? 'YES' : 'NO' , "\n" ; } } |
・出力
1 2 3 4 5 6 7 8 9 | 1 eq 2: NO 2 eq 2: YES 3 eq 2: NO 1 lt 2: YES 2 lt 2: NO 3 lt 2: NO 1 le 2: YES 2 le 2: YES 3 le 2: NO |
ちなみに、6行目を次のように書いてしまうとコンパイルエラーとなる。
無名ハッシュの参照をとると、その戻り値は 1個だけであり、ハッシュ初期化のための要素が奇数になってしまうためだ。
1 2 3 4 5 | my %comp = { 'eq' => sub { return $_ [0] == $_ [1] }, # equality 'lt' => sub { return $_ [0] < $_ [1] }, # less than 'le' => sub { return $_ [0] <= $_ [1] }, # less than or equal to }; |
エラーメッセージは以下のとおり。
Reference found where even-sized list expected at ... line 10. |
0 件のコメント:
コメントを投稿