in reply to non aliased default var $_

my @bla = @arr; tr/h//d for @bla;
or
my @bla = map{ tr/h//d; $_ } @{\@arr};

Replies are listed 'Best First'.
Re^2: non aliased default var $_ (not @{\...})
by tye (Sage) on Mar 10, 2010 at 19:24 UTC
    my @bla = map{ tr/h//d; $_ } @{\@arr};

    Your @{\...} does nothing. You surely meant

    my @bla = map{ tr/h//d; $_ } @{[@arr]}; # ^ ^

    - tye        

      You surely meant

      You're correct.

Re^2: non aliased default var $_
by LanX (Saint) on Mar 10, 2010 at 12:43 UTC
    > my @bla = @arr; tr/h//d for @bla;

    already mentioned in the OP

    > my @bla = map{ tr/h//d; $_ } @{\@arr};¹

    that's a nice one! 8)

    But maybe my (updated) alternative is easier to read (?):

    my @bla = map{ tr/h//d; $_ } map {$_} @arr;

    Cheers Rolf

    UPDATE: ¹) as tye pointed out it should be @{ [@arr] }

      > my @bla = @arr; tr/h//d for @bla;

      already mentioned in the OP

      Sorry. I missed that. But then, that makes me wonder why you are seeking an alternative to it?

      From my perspective, it's a no brainer. On my system, the first alternative runs in 1/64th of the time and uses half the memory to your double map solution;

      C:\test>perl -MTime::HiRes=time -wE"my @a= 0..1e6; my $t= time;my @bla= @a; tr[0][]d for @bla; say tim +e-$t; <>" 0.488373041152954 C:\test>perl -MTime::HiRes=time -wE"my @a= 0..1e6;my $t= time;my @bla= map{tr/h//d; $_}map{$_} @a;say +time-$t; <>" 32.5820000171661

      I realise that you may not work with million element arrays very often, but getting into good habits will save you grief when you are. And it just so much clearer.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        > But then, that makes me wonder why you are seeking an alternative to it?

        I'm meditating more about orthogonal code than speed.

        But you are really measuring strange things on your sytsem

        lanx@ubuntu:~$ perl -MTime::HiRes=time -e'my @a= 0..1e6;my $t= time;my + @bla=@a; tr/h//d for @bla;print time-$t; <>' 2.48298692703247 lanx@ubuntu:~$ perl -MTime::HiRes=time -e'my @a= 0..1e6;my $t= time;my + @bla= map{tr/h//d; $_} @{\@a};print time-$t; <>' 7.50910615921021 lanx@ubuntu:~$ perl -MTime::HiRes=time -e'my @a= 0..1e6;my $t= time;my + @bla= map{tr/h//d; $_}map{$_} @a;print time-$t; <>' 8.25657296180725

        Cheers Rolf