use strict; use Data::Dump qw/dump/; my %data; while () { chomp; my ( $field1, $field2, $field3, $field4 ) = split '\s+'; $data{$field1}{$field2}{'min'} = $field3 if ( not defined $data{$field1}{$field2}{'min'} or $field3 < $data{$field1}{$field2}{'min'} ); $data{$field1}{$field2}{'max'} = $field4 if ( not defined $data{$field1}{$field2}{'max'} or $field4 > $data{$field1}{$field2}{'max'} ); } ## end while () print dump( \%data ); __DATA__ 253868 20 317 2628 253868 20 317 7294 256158 9 329 371 256158 9 329 86450 728481 1 353 1361 154664 7 440 449688 154664 7 440 563 #### { 154664 => { 7 => { max => 449688, min => 440 } }, 253868 => { 20 => { max => 7294, min => 317 } }, 256158 => { 9 => { max => 86450, min => 329 } }, 728481 => { 1 => { max => 1361, min => 353 } }, }