__output I want__ (which I am not getting) server_1 10.1.1.1 10.1.1.2 10.1.1.3 10.1.1.4 10.1.1.5 192.168.1.1 192.168.1.2 while ( ) { my @array_ip; chomp; my ($swit,$server,$ip_range) = split; my ($b_real_ip,$b_ip, $e_ip) = $ip_range =~ m#(\d+\.\d+\.\d+\.)(\d+)\-(\d+)#; my $b_ip_copy = $b_ip; my @ip_g; while ( $b_ip_copy <= $e_ip ) { my $b_ip_final = join('',$b_real_ip,$b_ip_copy); push @ip_g , $b_ip_final; ++$b_ip_copy; } $HoA{ join('_',$swit,$server) } = \@ip_g; } __DATA__ server 1 10.1.1.1-10.1.1.5 server 2 192.168.1.1-192.168.1.5 server 1 192.168.1.1-192.168.1.2