2017-07-05 5 views
2

I次のコードを持っている:なぜ// =(defined-or)は配列に対してスカラーと同じように機能しないのですか?

$var //= 1; 
@arr //= qw/ 1 2 3 /; 

をしかし、私はエラーが出ます:

Can't modify array dereference in defined or assignment (//=) at ...

でもこの@arr ||= qw/ 1 2 3 /;が動作しません。

Can't modify array dereference in logical or assignment (||=) at ...

をしかし、これは期待通りに動作します:

@arr = @arr || qw/ 1 2 3 /; 

print "@arr"; # 1 2 3 
+1

配列とハッシュ変数は決して定義できません。空のみですが、エラーとは関係ありません。 – ikegami

答えて

3

配列とハッシュ変数が未定義、唯一なることはありません。 @arr = undefと書くと、@arrは、1つの未定義スカラを含む1要素配列になります。すなわち、未定義のアレイ

@arr //= qw/ 1 2 3/

が両方のオペランドにスカラコンテキストを課すこの表現ではありません。 scalar @arrがに割り当てることができず、この

@arr = qw/ 1 2 3/unless @arr 

あなたはまた、条件を使用することができ空の配列使用を設定するには、とにかく

を未定義にすることはできません@arrの要素数であるのに対しscalar(qw/ 1 2 3 /)は、3です式

1

"Assignment Operators" in perldoc perlopを参照してください:

These combined assignment operators can only operate on scalars...

+2

[こちら](http://perldoc.perl.org/perlop.html#Logical-Defined-Or)もご覧ください: '@a = @b || @c; 'は本当に' @a =スカラー(@b)||を意味します。 @c; '。 – Dada

+0

@Dada:オペランドがスカラーコンテキストでテストされていても、そのままの状態で返すと便利です –

+3

あなた自身の質問に答えていることを考えれば、なぜ**なぜ**パート「perlop」の引用で提供されているよりも詳細に説明されています。 –

関連する問題