しゃのんあどべんとかれんだー 17 日目 (Perl5で選択的代入時、undef(ined) の場合にのみ変数を初期化する方法) 匿名 匿名 この記事は、しゃのんあどべんとかれんだー 17 日目の記事です。 ![Perl5](http://3.bp.blogspot.com/-EsnN2U5YrhU/VopzFcAOwLI/AAAAAAAAAWA/E8DyRxa7WPI/s200/perl.png) どうも、munepom (`@__munepom__`) です。 今回は、Perl 5 で論理和を利用した選択的代入時の小ネタです。 # それは、とあるプルリクエストにて。。。 Perl 5 では、代入しようとした変数が偽と判定された場合にデフォルト値を代入するため、論理和 (||) を利用した選択的代入が利用できます。 なわけで、つい `my $bar = $foo || 100;` のようなコードを書きますね。書いてしまいますよね。。。 上記コードにて、もし、`$foo = 0` となっていたら、どうなるでしょうか? そう、`$bar = 100` となってしまいます。 もし、`$bar = 0` となることを期待していたら、バグですね、コレ。 # どうすりゃいいのよ? 値が未定義の場合にのみデフォルト値を利用したい場合は、// (double slash) を利用しましょう。 `my $bar = $foo // 100;` と書くと、$foo が undef の場合にのみ、デフォルト値が採用されます。 偽判定が楽に書ける言語は便利な反面、思わぬ落とし穴がありますね。 #### サンプルコード ``` #!/usr/bin/env perl use strict; use warnings; use utf8; use feature qw/say/; my $foo = 0; my $bar = $foo || 100; say $bar; # 100 $bar = $foo // 100; say $bar; # 0 $foo = undef; $bar = $foo // die "undefined!"; # die されますねん ``` #### 参考資料 [perldoc](http://perldoc.perl.org/perlop.html#Logical-Defined-Or) ますます安心できるコードを目指して(?) レッツ Enjoy! (・ω・)ノ Tweet Share Share Share Share