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 件のコメント:
コメントを投稿