in reply to Re: Can this code be optimized further?
in thread Can this code be optimized further?

You can use a hash to reroute things to the lexical arrays so you don't have to eval:
my (@a, @b); my %router = (a => \@a, b => \@b); foreach my $value (@temp) { push @{$router{$1}}, $2 if $value =~ /([ab])_(.*)/; } print "@a <==> @b";

Caution: Contents may have been coded under pressure.

Replies are listed 'Best First'.
Re^3: Can this code be optimized further?
by Fletch (Bishop) on Feb 10, 2005 at 15:34 UTC

    And if you had 10 arrays you'd want to keep that hash up to date? 20? 30?

    (Of course not, you'd use a HoA and not screw with this in the first place. :)

    That being said, in this specific case of just a and b I'd personally have probably used something like BrowserUK's @{ $1 eq 'a' ? \@a : \@b} below; but the eval's more flexible if you have a large number of destinations (then again with a large number of destinations you'd probably want an HoA). Of course at the moment I'd be more likely to just use Enumerable#partition and be done with it, but that's another language all together.

      And if you had 10 arrays you'd want to keep that hash up to date? 20? 30?
      The effort is linear with declaring them in the first place: one entry in the hash for each new array.

      And if your names are simply consecutive letters, the additional effort is constant: just change the ending character in the slice below.

      my @temp=qw(a_1 b_1 a_2 a_3 a_4 e_2 a_5 b_3 a_6 b_4); my %router; @router{'a'..'e'} = \(my (@a, @b, @c, @d, @e)); my $keys = join '', keys %router; foreach my $value (@temp) { push @{$router{$1}}, $2 if $value =~ /([$keys])_(.*)/; } print "@a <==> @b, @e\n";

      Caution: Contents may have been coded under pressure.