3

次の構文の perl コードに出くわしました。

sub new{
my ($class, $value)=@_;
$lobby ||= bless{
e=>undef;},$class
}

構文の||=意味は何ですか?

私はそれをキーワードとしてググることに失敗し、perldoc で同様の構文を見つけることができませんでした。

4

5 に答える 5

9

演算子の意味はperlopにあります。

今それが何をするか:$lhs ||= $rhsと同等$lhs = $lhs || $rhsです。これは、Perlish の意味で false の場合に$rhsが割り当てられることを意味します。これは、空の文字列の場合は 0 の数値になります。$lhs$lhs$lhsundef

于 2012-11-16T08:29:32.813 に答える
8
EXPR1 ||= EXPR2;

と同じです

EXPR1 = EXPR1 || EXPR2;

exceptEXPR1は一度だけ評価されます。これは、デフォルトを設定する便利な方法です。例えば:

sub foo {
   my %args = @_;
   $args{host} ||= "localhost";  # Provide a default host name if none provided.
   ...
}

あなたの場合、シングルトンコンストラクターがあるようです。初めてnew呼び出されると、新しいオブジェクトが作成されます。後続の呼び出しでは、以前に作成されたオブジェクトが返されます。

于 2012-11-16T08:29:14.040 に答える
3

これを完了するために、perl の古いバージョン (5.10 以降)では、true-orの代わりにdefined-or 演算子//||を使用できます。これは、デフォルト値を設定するために使用する場合により良いセマンティクスを持っています。

$foo ||= 42;    # $foo = $foo || 42;

たとえば、この変数の値を 42 に設定すると、 perlish $fooの意味で false になります。問題は、両方とも false であるため、この演算子は定義されているが false の値と未定義の値を区別できないことです。

$foo //= 42;    # $foo = $foo // 42;

この行は、以前に定義されていなかった場合に値を設定します。これは、しばしば必要なことです$foo。のように短絡します。||

于 2012-11-16T09:22:46.090 に答える
3

x ||= yの略ですx = x || y

perlopのドキュメントを参照してください。

于 2012-11-16T08:29:06.047 に答える
2
$x ||= $y;

と同じです

$x = $x || $y;
于 2012-11-16T08:29:54.087 に答える