use strict; use warnings; use Data::Dumper; use List::Util qw{ min max }; open my $textFH, q{<}, \ <<'END_OF_FILE' or die qq{open: $!\n}; hi: 65 abcdefghijklmnopqrst 85 bye: 12 bcdefghijklmnopqrstu 32 hi: 86 sagfsdgsgwsehbbdgops 106 bye: 33 afasdfdfafasaafadfad 53 END_OF_FILE my %dataItems = (); while ( <$textFH> ) { next unless m{^(hi|bye):\s+(\d+)\D+(\d+)}; push @{ $dataItems{ $1 }->{ from } }, $2; push @{ $dataItems{ $1 }->{ to } }, $3; } close $textFH or die qq{close: $!\n}; print Data::Dumper->Dumpxs( [ \ %dataItems], [ q{*dataItems} ] ); my $hiFrom = min( @{ $dataItems{ hi }->{ from } } ); my $hiTo = max( @{ $dataItems{ hi }->{ to } } ); my $byeFrom = min( @{ $dataItems{ bye }->{ from } } ); my $byeTo = max( @{ $dataItems{ bye }->{ to } } ); print qq{\$hiFrom = $hiFrom and \$hiTo = $hiTo\n}, qq{\$byeFrom = $byeFrom and \$byeTo = $byeTo\n}; #### %dataItems = ( 'hi' => { 'to' => [ '85', '106' ], 'from' => [ '65', '86' ] }, 'bye' => { 'to' => [ '32', '53' ], 'from' => [ '12', '33' ] } ); $hiFrom = 65 and $hiTo = 106 $byeFrom = 12 and $byeTo = 53