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
####
Hadrosaurus 1.4
Euoplocephalus 1.87
Stegosaurus 1.90
####
Hadrosaurus 1.2
Stegosaurus 1.40
Euoplocephalus 1.6