http://qs321.pair.com?node_id=759921


in reply to Re: Why does foo() evaluate in array context in "${\foo()}"?
in thread Why does foo() evaluate in array context in "${\foo()}"?

I'll agree with ikegami and say that's weird.

But I'll also admit that I'm just saying that to make it look like I know what I am talking about. In reality the catch listed above doesn't make any sense to me.

That is, I've read the documentation on the Perl debugger (although I've never used it myself). So I know that x @array = (1..3) evaluates the line in list context and dumps results. Listing the element indices threw me for a moment, but I blame Friday for that.

But what, for example, would you expect for the second command? Without the backslash, I look at (@array, (@array)) and think that it's a little confusing. I think it just evaluates as the concatenation of both lists, yes? Adding the backslash and I have no idea what it should look like. What gets evaluated first? I've taken a peek at perlop but it doesn't indicate if the backslash has a higher precedence than parentheses -- I would expect no, but with the oddity here I can't say for sure.

Any help you can give on unraveling what's going on here would be appreciated.

Replies are listed 'Best First'.
Re^3: Why does foo() evaluate in array context in "${\foo()}"?
by repellent (Priest) on Apr 24, 2009 at 23:05 UTC
    The way I see it, the backslash \( ) syntax has to evaluate its arguments in list context.

    It also has to treat @arrays and %hashes with care: should it expand it out into a list & take references of its elements, or just take the reference to the actual @array / %hash itself?

    To disambiguate the two, the second command shows that perl won't expand @array / %hash into LIST unless you have specifically parenthesized it.

    The third command shows that if @array / %hash was the only argument to \( ), then perl makes the (inconsistent) choice to expand it into a LIST, and take the reference of each list element. A probable rationale is that if you wanted the reference to the actual hash itself, you would do \%hash instead of \(%hash).

    The fourth command is like the second command. The empty list puts perl back in the second command's evaluation "frame of mind".