ヤダヤダ演算子、他、Perl 5.12 の新機能


割と大きな変更が多かった Perl 5.10 と比べて Perl 5.12 の変更点は小粒。内部的なことはよくわからんので、文法上の新機能を(わかる範囲で)いくつか纏めてみた。

http://perldoc.jp/docs/perl/5.12.0/perl5120delta.pod

1. ヤダヤダ演算子

「未実装であること」を表す演算子「...」が追加された。Perl6 に載る予定の機能みたいだけど、このネーミングは何なんだw 実際に英語でも「Yada Yada Operator」である。以前のバージョンからある(そしてほとんど使われていない)範囲演算子「...」と紛らわしい。未実装な関数(ブロック)に対するプレースホルダとして使うことが狙いだ。こんな風にして使う。

my %funcs = (
    f1 => sub { "OK!" },
    f2 => sub { 0 .. 9 },  # 範囲演算子
    f3 => sub { 0 ... 9 }, # 範囲演算子
    f4 => sub { ... },     # ヤダヤダ演算子
);
for ( sort keys %funcs ) {
    print "$_ => ";
    eval { say $funcs{ $_ }->() };
    $@ and say $@;
}

出力

f1 => OK!
f2 => 0123456789
f3 => 0123456789
f4 => Unimplemented at F:\TEMP\VINCF.tmp line 5.

2. each 演算子の拡張

主に、ハッシュを網羅的に走査するのに使われる each 演算子が配列にも使用可能になった。ハッシュの時と違ってちゃんと配列の順番通りに結果が出てくるみたい。配列を走査するときに、for 文で添え字のための変数を用意する手間が省けていいかもね。

my @ary = qw! a b c !;
while ( my ( $i, $v ) = each @ary ) {
    say "$i => $v";
}

出力

0 => a
1 => b
2 => c

3. 後置 when

文修飾子として when 節を使用可能になった。見た目が自然な文章により近くなったね。

for ( 0 .. 4 ) {
    my $i = 1 + int rand 100;
    printf "%3d : ", $i;
    given ( $i ) {
        say "Perfect!" when [ 67 .. 100 ];
        say "Good!"    when [ 34 ..  66 ];
        say "mmm..."   when [  1 ..  33 ];
        default { say "Error!" }
    }
}

出力

 10 : mmm...
 96 : Perfect!
 39 : Good!
 64 : Good!
 85 : Perfect!

4. ローカルな delete

delete local ハッシュ要素」という構文が用意された。スコープ内でローカルに要素を削除することが出来る。いまいち使い道が……。モジュールを呼び出すときに %INC ハッシュから要素を消して依存関係をいじったりするのだろうか。

my %hash = ( a => 3, b => 6, c => 9 );
{
    print "test1 : ";
    delete local $hash{b};
    say $hash{b} // "NONE!";
}
print "test2 : ";
say $hash{b} // "NONE!";

出力

test1 : NONE!
test2 : 6

4 thoughts on “ヤダヤダ演算子、他、Perl 5.12 の新機能

  1. こっちは正確な由来も書いてありますね。かなり砕けた言葉を正式名(?)に採用したんだな。

コメントを残す