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 見ても特に何も書いてないし、問題ないのかな?誰か知ってたら教えてください。