#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $current_name; my %hash1; while (my $line = ){ chomp $line; if($line =~ /^name\s+(\S+)/) {$current_name = $1;} push @{$hash1{$current_name}}, $_ for $line =~ /\d+/g } print Dumper \%hash1; __DATA__ name foo num 111 222 333 444 name jack num 999 111 222 333 num 333 444 555 777