defined-or(//)
ブログが続かないわけ | perl の作法 #2 「||=」の使い方 より引用
perl の作法 #2 「||=」の使い方
さらに、これは
$value ||= $default_value;
と書けます。
※注意
$value に「0」をセットする可能性がある場合はこの書き方はできません。「0」が偽と評価されてしまうからです。その場合defined などを利用しましょう。
ということですが、||= だと空文字列も偽と評価されます。undef の時だけ値を変更したいなら //= を使うのが正解かと。
#!/usr/local/bin/perl use strict; use warnings; print "logical or (||=)\n"; printf "string = %s\n", logical_or("string"); printf "1 = %s\n", logical_or(1); printf "undef = %s\n", logical_or(undef); printf "'' = %s\n", logical_or(''); printf "0 = %s\n", logical_or(0); print "-" x 40, "\n"; print "logical defined or (//=)\n"; printf "string = %s\n", logical_defined_or("string"); printf "1 = %s\n", logical_defined_or(1); printf "undef = %s\n", logical_defined_or(undef); printf "'' = %s\n", logical_defined_or(''); printf "0 = %s\n", logical_defined_or(0); sub logical_defined_or { my $value = shift; $value //= "CHANGED"; return $value; } sub logical_or { my $value = shift; $value ||= "CHANGED"; return $value; }
こんなスクリプトを書いて実行してみます。
logical or (||=) string = string 1 = 1 undef = CHANGED '' = CHANGED 0 = CHANGED ---------------------------------------- logical defined or (//=) string = string 1 = 1 undef = CHANGED '' = 0 = 0
//, //= を使えるのは Perl 5.8.1 からのようです。perldelta581 にこんな記述がありました。
o A new operator "//" (defined-or) will be available. This means that one will be able to say $a // $b instead of defined $a ? $a : $b and $c //= $d; instead of $c = $d unless defined $c; The operator will have the same precedence and associativity as "||". A source code patch against the Perl 5.8.1 sources will be available in CPAN as authors/id/H/HM/HMBRAND/dor-5.8.1.diff.
ところでこの defined-or(//) 演算子って experimental なものではないんですよね?どこかでそんな記述を見たような気もするのですが、思い出せません。キーワード "//" だとうまいこと検索できなくて。。。perlop 見ても特に何も書いてないし、問題ないのかな?誰か知ってたら教えてください。