chop (%key_hash = map { split /\s*[|]\s*/,$_,2 } grep (!/^$/,)); ^ ^ ^ ^ ^ ^ ^ ^ | | | | | | | | | | | | | | | + - File handle | | | | | | + - Let only non-empty file lines pass | | | | | + - Split string into two parts | | | | + - Default scalar containing a file line | | | + - Zero or more whitespaces | | + - Vertical bar as only member in character set | + - Zero or more whitespaces + - Should be 'chomp' to remove the trailing newlines #### use strict; use warnings; use Data::Dumper; chomp (my %key_hash = map { split /\s*[|]\s*/,$_,2 } grep (!/^$/,)); print Dumper \%key_hash; __DATA__ AAA|B|C|D|E BBB|G|H|I|J CCC|1|2|3|4 DDD|6|7|8|9 #### $VAR1 = { 'CCC' => '1|2|3|4', 'BBB' => 'G|H|I|J', 'DDD' => '6|7|8|9', 'AAA' => 'B|C|D|E' };