Perl: как объявить пустые ссылки массива в новом хэше?

у меня есть строгие и предупреждения, но он продолжает жаловаться на инициализацию следующей строки:

$hash{$key} = ($row, [], [], [], '');

Он предупреждает об этой единственной строке:

"Useless use of private variable in void context"

"Useless use of anonymous list ([]) in void context" (3 times)

я заполняю данные позже, но я хочу, чтобы индексы 1, 2, 3 были ссылками на массив, а индекс 4-строкой. Я получаю доступ и заполняю данные следующим образом:

$hash{$key}->[1]->[3] = 'Data';
$hash{$key}->[4] = $hash{$key}->[4] . 'More Data';

очевидно, я делаю что-то не так, но я не совсем уверен, как сделать это правильно. (Кроме того, я знаю, что последняя строка избыточна, может ли это также быть суммировано более приятным способом?)

3 ответов


элементы хэша могут быть только скалярами, поэтому вам нужно изменить свое назначение, чтобы использовать конструктор анонимного массива вместо parens:

$hash{$key} = [$row, [], [], [], ''];

посмотреть perldsc для получения дополнительной информации.

строку:

$hash{$key}->[4] = $hash{$key}->[4] . 'More Data';

можно написать так:

$hash{$key}->[4] .= 'More Data';

и, наконец, если вы не любите их,-> символы неявны между разделителями индекса, поэтому $hash{$key}->[1]->[3] означает то же самое как $hash{$key}[1][3]


Я не совсем уверен, что вы пытаетесь сделать, но если вы хотите назначить массив скалярному значению, вам нужно использовать скобки для создания анонимного массива:

$hash{$key} = [$row, [], [], [], ''];

в вашем случае то, что вы пытаетесь сделать, интерпретируется следующим образом:

$row, [], [], [];
$hash{$key} = '';

потому что вы не можете назначить список значений скалярной (одно значение переменной). Вы можете, как мы сделали выше, однако, назначить ссылка на анонимный массив содержащих список значений для скаляра.


вы почти поняли.

помните, что каждое значение хэша и массива должно быть скалярным, поэтому, если вы хотите хэш массивов, вы должны назначить ссылку на массив вашему хэш-ключу. Итак:

$hash{$key} = [ $row, [], [], [], '' ];

это то, что вы хотите.