Perl: ハッシュの中のサブルーチン
任意のキーによって処理内容自体を変えたい場合、if 文の連鎖よりもハッシュを使ったほうがエレガントだ。
単純な処理なら、無名サブルーチンでよい。
#!/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 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個だけであり、ハッシュ初期化のための要素が奇数になってしまうためだ。
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 件のコメント:
コメントを投稿