Perl5.10になって、switch文 が正式に使えるようになりました。

# code 1
use feature q/:5.10/;
my $i = 5;
given ($i) {
  when (4) { say "Oops" }
  when (5) { say "yes" }
  when (6) { say "Oh No" }
  default { say "no" }
}

smart matching と相まって非常に便利です。

が、旧来のswitch技法との組み合わせ技である

# code 2
my $i = 5;
my $r = do {
  if ( $i== 4 ) { "Oops" }
  elsif ( $i== 5 ) { "yes" }
  elsif ( $i== 6 ) { "Oh no" }
  else { "no" }
};

# code 3
my $i = 5;
my $r = ( $i== 4 ) ? "Oops" :
        ( $i== 5 ) ? "yes"  :
        ( $i== 6 ) ? "Oh no":
                      "no";

相当のものはどうもgiven-when単体ではできなさそう。

# code 4
use feature q/:5.10/;
my $i = 5;
my $r = do {
given ($i) {
  when (4) { "Oops" }
  when (5) { "yes" }
  when (6) { "Oh No" }
  default { "no" }
}};

とやっても code 4 の $r には undef が入ってるご様子。

もちろん、

# code 5
use feature q/:5.10/;
my $i = 5;
my $r = eval {
given ($i) {
  when (4) { return "Oops" }
  when (5) { return "yes" }
  when (6) { return "Oh No" }
  default { return "no" }
}};

はうまく行くけど、何か違う気がするし..

何だろう。switch statement は EXPR じゃないってのは判るけど、
do BLOCKのreturn valueであるvalue of the last command in the sequence of commands indicated by BLOCK.(perldoc -f do)は一体どれだ??

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は「無い」という結論になりました。残念。

トラックバック(0)

トラックバックURL: http://floralcompany.jp/mt/mt-tb.cgi/185

コメントする

AUTHOR

  • turugina (虎王 剱奈)
  • E-mail: turugina {at} floralcompany.jp
  • pixiv
  • ニジエ

2014年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.10

- 警 告 -

本サイトにはいわゆる「18禁画像」(イラスト)へのリンクが存在します。 未成年の方や、その手の画像に不快感を覚える方は、 該当記事(「えちぃの」及び「ちょっとえちぃの」カテゴリ) をご覧にならないようお願いいたします。

上記を理解した上で非表示のブログパーツを表示する
あわせて読みたいブログパーツ
ついった
drawr/pixiv/twitpic