rjh прямо на деньги.
Я написал слишком много кода, который делает именно то, что вы описываете - хэш-значение является ссылкой на массив, если это не так. Пачки и пачки условной проверки типов. И вот однажды мне пришло в голову: «Почему я пишу всю эту чушь? Просто везде используй ссылку на массив, тупица», - сказал я себе. С того дня синие птицы летают с деревьев, чтобы петь мне, когда я гуляю в парке.
push @{$hash{$key}}, $val;
Это все, что тебе нужно сделать. Если ключ не существует, массив автоматически обновляется.
Если вы не любите autoviv и хотите быть явным, выполните:
$hash{$key} = [] unless exists $hash{$key};
push @{$hash{$key}}, $val;
Даже этот «многословный» подход намного короче.