in reply to Using a number to determine which array to push onto

Please see Writeup Formatting Tips for info on how to properly format posts here. In this case, wrap code in <code> tags and paragraphs in <p> tags.

Use a hash, or more specifically a hash of arrays:

#! perl use strict; use warnings; use Data::Dumper; my @transactions = ( 'yadda 01 abc', 'yadda 03 sss', 'yadda 02 asdsdbc', 'yadda 02 adfgbc', 'yadda 01 abgxvc', 'yadda 02 azdfbc', 'yadda 04 azdfbc', 'yadda 04 abdc', ); my %results; foreach (@transactions) { my ($number) = /\s(\d+)\s/; push @{$results{$number}}, $_; } print Dumper \%results;

which outputs:

$VAR1 = { '01' => [ 'yadda 01 abc', 'yadda 01 abgxvc' ], '03' => [ 'yadda 03 sss' ], '04' => [ 'yadda 04 azdfbc', 'yadda 04 abdc' ], '02' => [ 'yadda 02 asdsdbc', 'yadda 02 adfgbc', 'yadda 02 azdfbc' ] };

You could also accomplish the above using an array of arrays, relying on the employee number as your index. See perlretut and/or perllol. For a discussion of why to use this structure as opposed to a large number of differently named arrays, see Why it's stupid to use a variable as a variable name.

Replies are listed 'Best First'.
Re^2: Using a number to determine which array to push onto
by ikegami (Patriarch) on Dec 20, 2010 at 20:18 UTC

    No need to stop using employee names.

    use strict; use warnings; use Data::Dumper qw( Dumper ); my %employees = ( '01' => 'Joe', '02' => 'Ed', '03' => 'Sam', '04' => 'Wendy', ); my @transactions = ( 'yadda 01 abc', 'yadda 03 sss', 'yadda 02 asdsdbc', 'yadda 02 adfgbc', 'yadda 01 abgxvc', 'yadda 02 azdfbc', 'yadda 04 azdfbc', 'yadda 04 abdc', ); my %transactions_by_employee; for (@transactions) { my ($employee_number) = /\s(\d+)\s/; my $employee_name = $employees{$employee_number} // 'unregistered'; push @{ $transactions_by_employee{$employee_name} }, $_; } print(Dumper(\%transactions_by_employee));

    That said, it might be advantageous to only resolve the employee numbers during output. This would allow one to differentiate the different unregistered employees, for example.