List::MoreUtils の any の実装と使用方法を見て再発見。
# 実装
sub any (&@) {
my $f = shift;
return if ! @_;
for (@_) {
return 1 if $f->();
}
return 0;
}
# 使用方法
print "At least one value undefined"
if any { !defined($_) } @list;
何故に、ハッシュリファレンスが、コードブロックとして、ちゃんと評価されるのか、疑問に思った。。。で、any の実装で、プロトタイプ宣言を行っていたから、これが、何か怪しいなぁって事で、
プログラミングPerl〈VOLUME1〉を開いてプロトタイプについて再確認してみると。
& が最初の引数であった場合、特別扱いされることを示している。通常は、プロトタイプ文字 & は \&foo や sub {} のような引数を要求する。しかし、 & を最初の引数として指定した場合には、無名サブルーチンの sub を省略して「間接オブジェクト」スロットにブロックだけを置くことができる(この場合、ブロックの後ろにはコンマは置かない)。
& の素晴らしい点は、 & を第1引数とすることによって、新しい構文が作り出せることである:
~ プログラミングPerl〈VOLUME1〉 page 263 より引用
なるほど~、プロトタイプ宣言した場合は特殊なのね、だから、ブロック渡しが完結にコーディングできるのですな。普段、何気なく使っていた、map や grep、sort も、そうゆう実装になっているのかなぁ、とか思った。あと、$_ のスコープが、グローバルだから、ちゃんと中でも参照できるのだなぁ、とかも思った。
0 件のコメント:
コメントを投稿