in reply to Re^2: when to use lists/hash vs references?
in thread when to use lists/hash vs references?

Of course. So don't do that.

Declare an array, and pass a reference.

I also prefer to use

sub arrayManip { our @a; local *a = shift; # do stuff with @a } my @array = (...); arrayManip( \@array );

But you doubtless consider that too "complex".

Replies are listed 'Best First'.
Re^4: when to use lists/hash vs references?
by chromatic (Archbishop) on Jul 16, 2010 at 01:20 UTC
    But you doubtless consider that too "complex".

    I consider it a silly micro-optimization, because the programs I write tend to do IO. (And did you benchmark the cost of accessing the symbol table versus a lexical variable?)

      I consider it a silly micro-optimization, ... And did you benchmark the cost of accessing the symbol table versus a lexical variable?

      I don't prefer it for performance. I prefer it for the simplified syntax.

      Most of my programs do IO also. Usually a few seconds at the beginning and the end. In between they do lots of cpu-intensive stuff. Often many hours of it. So, for your delectation:

      #! perl -slw use strict; use Benchmark qw[ cmpthese ]; sub deref { my $r = shift; ++$r->[$_][1] for 0..$#$r; } sub alias { our @a; local *a = shift; ++$a[$_][1] for 0 .. $#a } my @a = map[1..3],1..1e6;; cmpthese -1, { deref => sub { deref( \@a ) }, alias => sub { alias( \@a ) }, }; __END__ c:\test>junk5 Rate deref alias deref 4.16/s -- -12% alias 4.72/s 13% --

      So 8 minutes saved on each hour. 3 hours over a day.

      BTW: If you'd called your "Modern Perl" movement, "Beginner's Perl", I wouldn't have a problem with it. Well, if you also dropped the justifictions and stuck with the facts.


      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.

        Well sure, doing more work takes more time. If you let Perl do the iteration, the difference between dereferencing and aliasing is benchmarking noise (and the difference between manual iteration and internal iteration saves you even more time):

        use Modern::Perl; use Benchmark qw[ cmpthese ]; sub deref { my $r = shift; ++$r->[$_][1] for 0..$#$r; } sub alias { our @a; local *a = shift; ++$a[$_][1] for 0 .. $#a } sub deref_iter { my $r = shift; $_->[1]++ for @$r; } sub alias_iter { our @a; local *a = shift; $_->[1]++ for @a; } my @a = map[1..3],1..1e6; cmpthese -1, { deref => sub { deref( \@a ) }, alias => sub { alias( \@a ) }, deref_iter => sub { deref_iter( \@a ) }, alias_iter => sub { alias_iter( \@a ) }, };