1.05.2012

Perl: Subroutines in a hash

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.
Use of uninitialized value in subroutine entry at ... line 14.
Can't use string ("") as a subroutine ref while "strict refs" in use at ... line 14.

0 件のコメント:

コメントを投稿