BrowserUk has a good point. You need to clarify your requirements. However, assuming you mean "as ordered in the file", the following code should do:
#!/usr/bin/perl use warnings; use strict; my %Invoices; my $last_name = ''; my %data; while(my $line = <DATA>) { chomp $line; # Split the fields into a hash. Depending on your # data, this might be better done with Text::xSV. @data{qw(orig inv name date time)} = ($line, split(/\s+/, $line)); next unless $data{name} eq 'Robb' or $data{name} eq 'Larry'; next if $last_name eq $data{name}; # If this field passes the tests, save a *copy* for later use. push @{$Invoices{$data{name}}}, {%data}; } continue { # Store the last name seen $last_name = $data{name}; } # For each (Larry Robb) foreach (keys %Invoices) { # Sort the invoices by date then time, in reverse order. $Invoices{$_} = [sort { $b->{date} cmp $a->{date} or $b->{time} <=> $a->{time} } @{$Invoices{$_}}]; # Print out the most recent invoice. print "Most recent for $_: $Invoices{$_}[0]{orig}\n"; } __DATA__ 1056128833340 Robb 2003-06-20 665 ** 1056128833340 t028348 2003-06-20 607 1055439973653 T012697 2003-07-22 962 1055439973653 t012697 2003-07-22 948 1055439973653 t806174 2003-07-15 792 1055439973653 T806174 2003-07-15 791 1055439973653 t021191 2003-07-08 786 1055439973653 Robb 2003-06-17 503 1055439973653 Larry 2003-06-16 815 ** 1055439973653 t021191 2003-06-12 646
If you mean "most recent" and "immediately previous" as in timestamp, you will need to read the whole file in at once, sort on the timestamp (move the sort in the code above out to work on the entire file; maybe un-reverse the sort-order as well), and then process as shown above.
bbfu
Black flowers blossom
Fearless on my breath
In reply to Re: Searching a multidimensional list
by bbfu
in thread Searching a multidimensional list
by Mister_Inkster
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |