use strict; use warnings; use Data::Dumper; my %app_map; readit (\%app_map,'2.csv','name',qw /name leg_len diet/); readit (\%app_map,'1.csv','name',qw /name str_len stance/); my @result; while ( my ($k, $v) = each %app_map ) { if(defined($v->{diet}) && $v->{diet} eq 'herbivore' && defined($v->{str_len}) ){ push @result,$v;} } my @sorted=sort {$a->{str_len} <=> $b->{leg_len}} @result; for my $row (@sorted) { print $row->{name}.' '.$row->{leg_len}."\n"; } #print Dumper \%app_map; exit; sub readit { my $db=shift; my $fn=shift; my $key=shift; my @vars=@_; open my $fh, '<', $fn or die $!; my $header1 = <$fh>; my $vn=$#vars; while(my $row = <$fh>){ chomp $row; my $h0={}; my @parts= split /\,/, $row; for my $ii (0..$vn){ unless (defined ($parts[$ii])) {$parts[$ii]='';} $parts[$ii]=~s/^\s+//; $parts[$ii]=~s/\s+$//; unless ($parts[$ii] eq '') { $h0->{$vars[$ii]}=$parts[$ii]; } } my $keyval=$h0->{$key}; my $h1=$db->{$keyval}; unless ($h1) { $db->{$keyval}=$h0; } else { while ( my ($k, $v) = each %$h0 ) {$h1->{$k}=$v;} } # exists } # row close $fh or die $!; } # readit