#!/usr/bin/perl -w use strict; use Data::Dumper; my %data; while () { chomp; my ($val, @keys) = split; my $lastkey = pop @keys; my $hashref = \%data; foreach my $k (@keys) { $hashref->{$k} ||= {}; $hashref = $hashref->{$k}; } $hashref->{$lastkey} = $val; } print Dumper \%data; __END__ val1 keyA keyX foo key1 val2 keyA keyY bar key2 val3 keyB keyZ baz key3