Первый ответ для этого конкретного примера, а затем некоторые комментарии
my $hash = {};
my @array = qw( A 0 B 1 2 3 4 c 5 d 6 7);
my $key;
foreach (@array) {
if (/\D/) {
$key = $_;
next;
} else {
push @{$hash->{$key}}, $_;
}
}
А если вы хотите поиграть в отладчике:
$ perl -de 0
DB<18> @array = qw( A 0 B 1 2 3 4 c 5 d 6 7);
DB<19> $hash={}
DB<20> foreach(@array){if(/\D/){$key=$_;next}else{push @{$hash->{$key}},$_}}
DB<21> x $hash
0 HASH(0x347e568)
'A' => ARRAY(0x348fee8)
0 0
'B' => ARRAY(0x346f188)
0 1
1 2
2 3
3 4
'c' => ARRAY(0x34cefb0)
0 5
'd' => ARRAY(0x346f1e8)
0 6
1 7
Комментарии: если ваши ключи не дают информацию о том, является ли значение скалярным или массивом ref, лучше иметь все значения одного типа (в данном случае arrayref)
Вы хотели бы проверить, имеет ли последний ключ значение, и решить, хотите ли вы инициализировать undef или нет.