http://www.perlmonks.org?node_id=1000355


in reply to comparing and removing values from an array of hashes

For numeric maximum, you can use max from List::Util. To filter the array, use grep.
#!/usr/bin/perl use warnings; use strict; use Data::Dumper; use List::Util qw(max); my @DA_head = qw(name check duration quantity price); my @DA; foreach ("A,Star_1GB,MONTH,1000,0", "B,Unlim60,MONTH,1000,6000", "C,Unlim,DAY,50,6000", "D,,MONTH,500,8000") { my %rec; @rec{@DA_head} = split /,/, $_; push @DA, \%rec; } my @checked = grep length $_->{check}, @DA; my @max_dur; for my $maxdur (qw/MONTH WEEK DAY/) { @max_dur = grep $maxdur eq $_->{duration}, @checked; last if @max_dur; } my @maximal = @max_dur; for my $attr (qw/quantity price/) { my $max = max map $_->{$attr}, @maximal; @maximal = grep $max == $_->{$attr}, @maximal; } print Dumper \@maximal;
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ