Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Re^2: Why does foo() evaluate in array context in "${\foo()}"?

by Nkuvu (Priest)
on Apr 24, 2009 at 21:41 UTC ( #759921=note: print w/replies, xml ) Need Help??

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".

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://759921]
[msh210]: doesn't append anything.
[msh210]: It should say "If the last nonempty element of LIST" or "If the string thus to be printed does not end in a newline""
[msh210]: Am I wrong?
[shmem]: no. You're right.
[msh210]: About time... last time I was right was... I don't even remember when.
[shmem]: perl -e 'warn "test$/", ^@^ '
[Eily]: well, at least it's right about warn doing the same thing as die :)
[shmem]: same with undef as last element
[msh210]: oh, good point. It's the best kind of correct
[shmem]: msh210: but I'd not call it a lie outright. That's when you do know the truth.

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (19)
As of 2017-04-24 12:41 GMT
Find Nodes?
    Voting Booth?
    I'm a fool:

    Results (439 votes). Check out past polls.