РЕДАКТИРОВАТЬ: я был неправ о необходимости использовать явную стрелку разыменования; при необходимости это делается в скобках, даже если первые скобки НЕ требуют разыменования. Тем не менее, я оставлю оставшуюся часть ответа в том виде, в каком она была опубликована с тех пор, как он был принят, но просто учтите, что если вы решите не использовать join
, вам на самом деле не нужно использовать $inventory{$key}->[0]
, но вы можете использовать $inventory{$key}[0]
первоначально размещено.
Просто имейте в виду, что первые (хэш) скобки не подразумевают разыменование, а вторые (массивы) скобки. Ваши ошибочные массивы в выходных данных были получены из зацикливания не только на ключах, но и на значениях хеша.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
В дополнение к использованию keys
вам также необходимо разыменовать ссылки на массив (вот почему вы видите каждое значение, выводимое как ARRAY с адресом - вы печатаете ссылки, а не значения массива разыменования), когда вы печатаете, поэтому ваш цикл становится примерно таким:
foreach my $key (sort keys %inventory) {
print FILE "$key\|$inventory{$key}->[0]\|$inventory{$key}->[1]\|$inventory{$key}->[2]\n";
}
Я, вероятно, переписал бы это немного более идиоматически, как:
foreach my $key (sort keys %inventory) {
print FILE (join '|', $key, @{$inventory{$key}}) . "\n";
}
Надеюсь, это поможет!