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};