use Data::Dumper; $filename = "codes.txt"; open $fh1, $filename or die "can't open $filename : $!\n"; $filename2= "./context.txt"; open $fh2, $filename2 or die "can't open $filename2 : $!\n"; chomp(@Ids=<$fh1>); LABEL: while(chomp(my $line = <$fh2>)){ foreach my $codeid (@Ids){ if($line =~ /-$codeid-/){ s/Event id -(\d+)-/$data{$codeid}=$1/e && next LABEL while(<$fh2>); } } } print Dumper \%data;