in reply to Re: Precendence and wantarray puzzling me
in thread Precendence and wantarray puzzling me

my @thingies = foo (); @thingies = bar () unless @thingies;
When I first saw that, I thought to myself "Couldn't that unless @thingies modifer be replaced by an ||=?" So I tried it, perl -e"@x=qw/foo bar/; @x ||= qw/baz/; print @x" And got this lovely error: Can't modify array dereference in logical or assignment (||=) at -e line 1, near "qw/baz/;". Can anyone explain why ||= doesn't work with an array, and what that error means?

Replies are listed 'Best First'.
Re: Precendence and wantarray puzzling me
by Abigail-II (Bishop) on Mar 04, 2004 at 21:27 UTC
    EXPR1 ||= EXPR2 is sort of a super charged EXPR1 = EXPR1 || EXPR2. However, if EXPR1 is an array (say @a), it would expand to: @a = @a || EXPR2. Nothing wrong with the latter, but the two @a's are quite different. The one on the left hand side is an lvalue in list context, the one on right hand side of the assignment is in scalar context. However, EXPR1 ||= EXPR2 isn't syntactic sugar for EXPR1 = EXPR1 || EXPR2, because in the latter, EXPR1 is executed twice, in the former, just once. But if EXPR1 in EXPR1 ||= EXPR2 is only going to be executed once, what should it be? The scalar value, or the list value? Both are needed.

    Abigail