Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re^5: Evil Interview Questions (memes)

by tye (Sage)
on Feb 10, 2008 at 00:28 UTC ( [id://667219]=note: print w/replies, xml ) Need Help??


in reply to Re^4: Evil Interview Questions (memes)
in thread Evil Interview Questions

return $foo; returns the value in $foo. It doesn't return the $foo variable. return bar(); returns the value(s) returned by bar(). So return @array; returns the values from @array. return $foo ? $bar : $baz; doesn't return a ternary operator. return returns a list of zero or more (scalar) values. Always.

But would we say that an array is a list or a scalar?

An array is a (type of) list, sure. Alternately, an array is something that holds a list such that you can manipulate the list.

And if we say that an array is a list, how do we explain how it behaves differently from a list in scalar context?

There's that broken meme again. There is no particular way that a "list" behaves in scalar context. Any number of ways of producing a list of scalar values (which is the "list" that an array contains) can have any number of different behaviors in a scalar context. A "list literal" aka "use of the comma operator, usually between parens", evaluates all but the last expression in void context and then evaluates the last expression in scalar context and returns the resulting scalar. A "list literal" doesn't even return the last value. So the answer to "What does a list return in a scalar context?" is, of course, "Mu!".

The term "list" can mean quite a few quite different things when talking about Perl. The two most common are "list of scalar values" and "list literal" (use of comma). So it makes little sense to talk categorically about what a "list" does.

The dicotomy "array or list" is a false one in Perl, despite it being fairly widely ascribed to. An array is a list.

- tye        

Replies are listed 'Best First'.
Re^6: Evil Interview Questions (memes)
by kyle (Abbot) on Feb 11, 2008 at 04:13 UTC

    That's illuminating. Thanks!

    Still, there are questions.

    A "list literal" aka "use of the comma operator, usually between parens", evaluates all but the last expression in void context and then evaluates the last expression in scalar context and returns the resulting scalar.

    The second code block in Re^4: Evil Interview Questions (memes) has what I think is the scenario you describe, but at no point does any item in the list have a different context from any other item. Can you demonstrate the behavior you describe here?

    Any number of ways of producing a list of scalar values (which is the "list" that an array contains) can have any number of different behaviors in a scalar context.

    Can you expand on this? I'm not sure what you mean by "ways of producing a list of scalar values" or what the "any number of different behaviors" would be.

    Thanks again for your remarks.

      The second code block in Re^4: Evil Interview Questions (memes) has what I think is the scenario you describe, but at no point does any item in the list have a different context from any other item.

      Thank you. That was a special case that I wasn't previously aware of. Consider:

      sub c { my $context= wantarray ? "list" : defined wantarray ? "scalar" : "void"; warn "$context( @_ )\n"; return( 'a', 'b' ); } sub t { return( c("a"), c("b") ); } my $scalar= ( c("one"), c("two"), c("three") ); warn $/; $scalar= t(); __END__ void( one ) void( two ) scalar( three ) scalar( a ) scalar( b )

      You see that a void context is used in cases "one" and "two". After some contemplation, I produced a theory as to why this is not done in the case of a list literal (use of comma) as the return expression of a subroutine. Consider:

      #!/usr/bin/perl -w use strict; my $scalar= ( 1, 2, 3 ); sub t { return( 1, 2, 3 ); } $scalar= t(); __END__ Useless use of a constant in void context at - line 3.

      Hmm. Or perhaps it is just an unintentional quirk.

      Can you expand on this? I'm not sure what you mean by "ways of producing a list of scalar values" or what the "any number of different behaviors" would be.

      See On Scalar Context (as well as my reply to it).

      - tye        

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://667219]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (5)
As of 2024-04-24 03:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found