Perl: Как мне объявить пустые ссылки на массивы в новом хэше - PullRequest
6 голосов
/ 22 декабря 2011

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

$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 ]

12 голосов
/ 22 декабря 2011

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

$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]

3 голосов
/ 22 декабря 2011

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

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

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

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

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

2 голосов
/ 22 декабря 2011

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

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

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

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

...