Humanity

Edit the world by your favorite way

given when break

Perl - id:tyruが毎日FizzBuzzを一生懸命書く日記 - fizzbuzzグループ

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

use feature qw(switch say);


sub stream { my $i = 1; sub { $i++ } }
sub fizzbuzz {
    my $gen = stream();
    sub {
        my $i = $gen->();
        given ([$i % 3 == 0, $i % 5 == 0]) {
            when ([1, 1]) { 'FizzBuzz' }
            when ([0, 1]) { 'Buzz' }
            when ([1, 0]) { 'Fizz' }
            default       { $i }
        }
    };
}

my $gen = fizzbuzz;
say $gen->() for 1..100;

こんなコード書いてもwhenのブロックの中の値が$_に代入されないしvoid contextとか言われる。
誰かこのコードで何が起こってるか分かる方教えてください...

ということをここに書こうとしたら風呂に入ってる間にid:nihmaさんが教えてくれてた。id:nihma++

nihma

whenの仕様みたいですね。
http://floralcompany.jp/archives/2008/03/perlswitch.html

Perl - id:tyruが毎日FizzBuzzを一生懸命書く日記 - fizzbuzzグループ

でURL見てたんですが、when,givenの他にbreakなんてものが導入されてたんですね。知りませんでした。それなんてC。
他にもこんな説明が。

perldoc perlsyn
"Every when block is implicitly ended with a break."
らしい。

で、
perldoc -f break
"Break out of a "given()" block."
ということなので、
given (何某) { ... } の last command は break() とゆーことに。。

ソースコード(op.cとかpp_ctl.cとか)を見ると、break()はwhenを抜けるOPに繋がってて->whenを抜けて->givenを抜けて... その間にEXPRとして使える値を設定することは無いので、
結局given-whenのvalue of last commandは「無い」という結論になりました。残念。

perlのswitch文 - FloralCompany.log

えー残念。
$_に最後の値を代入してくれたらいいんだけどなー。