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


in reply to regexp list return 5.6 vs 5.8

OK, one more question: How do you guys recommend that I flatten lists? I mean... say I have some values in an array, or in two arrays and I want to turn it into one flat list that will not have any array-specific or similar behavior. I can want to pass it from a subroutine, from a do statement or from a map block or eval or whatever...

Update: How about map $_, @stuff, @more_stuff?

Update 2: Nope. As documented: "In scalar context, returns the total number of elements so generated."

perl -le 'print scalar map $_, qw(a b c)' 3
use strict; use warnings; print "Just Another Perl Hacker\n";

Replies are listed 'Best First'.
Re^2: regexp list return 5.6 vs 5.8
by mrpeabody (Friar) on Jan 25, 2008 at 04:38 UTC
    OK, one more question: How do you guys recommend that I flatten lists? I mean... say I have some values in an array, or in two arrays and I want to turn it into one flat list that will not have any array-specific or similar behavior.

    You flatten lists like this:

    my @newarray = @oldarray; my @newarray = (@oldarray1, @oldarray2); my @newarray = (@oldarray, 2, 3, qw( foo bar baz ) );

    But your question doesn't make a lot of sense. You seem to be asking "How do I make an array that isn't an array", and the answer to that is "You can't".

    If you're trying to ask "How do I return different values from a function depending on the calling context", then look into wantarray as shmem suggests.

      I think the OP is essentially asking (Sixtease please correct me if I'm wrong) how you would make something like the following snippet print "e", and not "2"

      my @x = qw(a b c); my @y = qw(d e); print scalar (@x, @y); # prints "2" (number of elems in @y)

      treating the combined arrays as if they had been written like

      print scalar qw(a b c d e); # prints "e" (last elem in list)

      Kind of like this

      print scalar ((@x, @y)[0..@x+@y-1]); # prints "e" print scalar sub {@_[0..$#_]}->(@x, @y); # prints "e"

      but less ugly, and without having to take special care of the subtle problem you run into with older versions of Perl when the arrays are empty, and the selecting range for the slice becomes [0..-1]  (what this thread is about, essentially).

      Irrespective of whether you'd actually need to do something like this in real-life programming, it's still a valid question in and of itself, IMO.

Re^2: regexp list return 5.6 vs 5.8
by Errto (Vicar) on Jan 24, 2008 at 18:49 UTC
    What do you mean exactly? What kind of "array-specific" behavior are you trying to avoid? If you want to take data you are creating as a list but apply it in scalar context, you need to make some decision for yourself about what data you want and code accordingly. For example, map operates on a list and returns a list. If you want to use that in scalar context, and want something other than the length of the list as the value, you need to decide what you want. If you always want the last value, one way to do that is
    my $scalar = (map { some code } some list)[-1];