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の仕様みたいですね。
Perl - id:tyruが毎日FizzBuzzを一生懸命書く日記 - fizzbuzzグループ
http://floralcompany.jp/archives/2008/03/perlswitch.html
で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として使える値を設定することは無いので、
perlのswitch文 - FloralCompany.log
結局given-whenのvalue of last commandは「無い」という結論になりました。残念。
えー残念。
$_に最後の値を代入してくれたらいいんだけどなー。