Beefy Boxes and Bandwidth Generously Provided by pair Networks Cowboy Neal with Hat
Do you know where your variables are?
 
PerlMonks  

Re: map return to array reference

by ikegami (Pope)
on Jan 24, 2007 at 17:05 UTC ( #596287=note: print w/ replies, xml ) Need Help??


in reply to map return to array reference

  • Your deref $self->_getGood() twice, but the dump shows it's just a reference to an array of strings.
  • Your map returns a list of file names, but you assign it to a scalar. That sets $files_to_send to 6, the number of file names.
    Your map would return a list of file names, but you assign the result to a scalar. This causes map to return 6, the number of file names.
sub _getGood { my ($self,@args) = @_; print "_getGood()", Dumper $self->{_good}; # Returns a list of of 'Cxxxx' codes. return @{$self->{_good}}; } my @files_to_send = map {"$stage/$_.pdf"} $self->_getGood(); print map {"$_\n"} @files_to_send;

Update: The word "twice" was missing.
Update: Adjusted the wording for clarity in response to merlyn's reply.


Comment on Re: map return to array reference
Select or Download Code
Re^2: map return to array reference
by merlyn (Sage) on Jan 24, 2007 at 17:49 UTC
    Your map returns a list of file names, but you assign it to a scalar.
    That's not technically possible. The map is not returning a list, if it's being used in a scalar context. It just happens that if a map is used in a scalar context, it returns the number of items it would have created had it been used as a list. But it just as easily could return the day of the year instead (although not quite as useful).

    I know it may not sound like that's an important difference, but it's really important to understand that you don't ever get a list in a scalar context: in a scalar context, you get whatever the operation is defined to do in a scalar context instead. See On Scalar Context for more details.

      merlyn,
      It just happens that if a map is used in a scalar context, it returns the number of items it would have created had it been used as a list. But it just as easily could return the day of the year instead (although not quite as useful).

      Perl 5 uses documentation to explain the implementation so saying "it is documented to return the number of elements in scalar context so it can't just as easily return the day of year instead" doesn't hold much water. Fortunately, Perl 6 is intended to have a complete specification allowing for any number of implementations. This has nothing to do with the issue I wanted to make though.

      Your wording to me implies that map doesn't actually create the elements it counts. The docs say "In scalar context, returns the total number of elements so generated." which implies to me they are created. I know that there could be an optimization not to actually build up the return list such as happens when map is called in a void context with recent versions. If indeed it is as you say, a doc patch should be submitted to clarify.

      Cheers - L~R

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (4)
As of 2014-04-20 02:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (485 votes), past polls