次の構文の perl コードに出くわしました。
sub new{
my ($class, $value)=@_;
$lobby ||= bless{
e=>undef;},$class
}
構文の||=
意味は何ですか?
私はそれをキーワードとしてググることに失敗し、perldoc で同様の構文を見つけることができませんでした。
演算子の意味はperlopにあります。
今それが何をするか:$lhs ||= $rhs
と同等$lhs = $lhs || $rhs
です。これは、Perlish の意味で false の場合に$rhs
が割り当てられることを意味します。これは、空の文字列の場合は 0 の数値になります。$lhs
$lhs
$lhs
undef
EXPR1 ||= EXPR2;
と同じです
EXPR1 = EXPR1 || EXPR2;
exceptEXPR1
は一度だけ評価されます。これは、デフォルトを設定する便利な方法です。例えば:
sub foo {
my %args = @_;
$args{host} ||= "localhost"; # Provide a default host name if none provided.
...
}
あなたの場合、シングルトンコンストラクターがあるようです。初めてnew
呼び出されると、新しいオブジェクトが作成されます。後続の呼び出しでは、以前に作成されたオブジェクトが返されます。
これを完了するために、perl の古いバージョン (5.10 以降)では、true-orの代わりにdefined-or 演算子//
||
を使用できます。これは、デフォルト値を設定するために使用する場合により良いセマンティクスを持っています。
$foo ||= 42; # $foo = $foo || 42;
たとえば、この変数の値を 42 に設定すると、 perlish $foo
の意味で false になります。問題は、両方とも false であるため、この演算子は定義されているが false の値と未定義の値を区別できないことです。
$foo //= 42; # $foo = $foo // 42;
この行は、以前に定義されていなかった場合に値を設定します。これは、しばしば必要なことです$foo
。のように短絡します。||
x ||= y
の略ですx = x || y
perlopのドキュメントを参照してください。
$x ||= $y;
と同じです
$x = $x || $y;