Ваше хеш-объявление неверно, оно должно быть:
my %hash = ();
или просто:
my %hash;
Тогда остальная часть вашего кода будет слишком сложной и неправильной.
foreach (@a) {
my ($k, $v) = (split);
push @{$hash{$k}}, $v;
}
должно быть достаточно. См. Автовивификация , почему это работает.
С вашим кодом, когда вы впервые видите ключ, вы устанавливаете $hash{$k}
как скаляр. Тогда вы не можете push
что-то с этим ключом - для начала он должен быть массивом.
Тест if (-e $hash{$c})
неверен. -e
- это проверка файла существования. Если вы хотите узнать, существует ли ключ хеша, используйте:
if (exists $hash{$c}) { ... }
И print %hash;
не будет делать то, что вы ожидаете (и print %{$hash};
недействительно). Вы получите более симпатичный дисплей, если сделаете:
use Data::Dumper;
print Dumper(\%hash);
(Отличная отладка, это Data::Dumper
.)