Доступ к массивам внутри массивов - PullRequest
1 голос
/ 28 октября 2011

У меня есть два бита кода, которые производят различный вывод, и мне очень трудно понять, почему.

Фрагмент кода 1:

my @args = $bighash{'arguments'}{'allocations'};
print "$args[0][1]";

Фрагмент кода 2:

my @args = $bighash{'arguments'}{'allocations'}[0];
print "$args[1]";

В первом случае это печать ожидаемого значения. Во втором случае он вообще ничего не печатает. Кто-нибудь может объяснить это?

Ответы [ 3 ]

2 голосов
/ 28 октября 2011

Значения, хранящиеся в вашем хэше, являются ссылками на массив.Вы можете напрямую работать со ссылкой:

my $args = $bighash{'arguments'}{'allocations'};
print $$args[1];  # or $args->[1]

Или распаковать массив в новый:

my @args = @{ $bighash{'arguments'}{'allocations'} };
print $args[1];

Подробнее о perlref и perldsc справочных страниц.

2 голосов
/ 28 октября 2011

Ответ Эрика Строма в основном показывает, что вы правы ... но я удивлен, что никто не предлагал использовать Data :: Dumper для проверки структур данных, с которыми вы работаете. Вы действительно можете увидеть разницу между тем, что вы сделали, и исправлением Эрика. Это может помочь вам разобраться.

Re: использовать предупреждения ... вы должны получить предупреждение при попытке напечатать несуществующий элемент вновь созданного массива? Однажды мне сказали никогда не спрашивать в Интернете, пока я не использую строгие предупреждения. Это может быть немного экстремально, но -w и Data :: Dumper определенно помогут мне: -)

0 голосов
/ 28 октября 2011

Во фрагменте кода 2 вы фактически берете первый элемент в своем бигаше ([0] - первый элемент) и помещаете его как единственный элемент в массиве.Затем вы запрашиваете второй элемент, который не существует.

Если вы не помните «использовать предупреждения», это должно привести к одному, поскольку вы назначаете скаляр в виде массива.Я сам не проверял это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...