Проблема с доступом к элементу из анонимного массива Perl
Я пытаюсь использовать crypto_box_keypair
от Crypt::Sodium
:
my @keyPair = crypto_box_keypair();
Мое понимание (подтверждено Data::Dumper
) в том, что Crypt::Sodium
возвращает анонимный массив:
$VAR1 = [
'k?@ʵ????$p?-0?3',
'?1????qRo??;???1?'
];
Но я не могу получить доступ к отдельным элементам.
say scalar @keyPair;
Возвращает 1, несмотря на то, что два элемента четко обозначены Data::Dumper
?
А также
$keyPair[1]
является undef
,
3 ответа
Ты сделал Dumper(\@keyPair)
или же Dumper(@keyPair)
? Я подозреваю, что вы сделали последнее, и в этом случае $VAR1
является первым (и единственным) элементом @keyPair
, Если вы хотите сбросить массив, передайте ссылку на него; так легче понять.
Продолжая с этим предположением, crypto_box_keypair
кажется, возвращает ссылку на массив, а не несколько скаляров. Таким образом, использование должно быть
my $keyPair = crypto_box_keypair();
say scalar @$keyPair;
say $keyPair->[0];
say $keyPair->[1];
Если он возвращает ссылку на массив, вам нужно использовать скаляр для хранения результата, а не массив.
my $keyPair = crypto_box_keypair();
say scalar @$keyPair;
say $keyPair->[0];
say $keyPair->[1];
Когда ты сделал my @keyPair=crypto_box_keypair();
Вы присвоили ссылку на весь массив первому элементу нового массива, поэтому его размер равен 1, и вы можете видеть его содержимое, когда вы его выгружаете.
Согласно документации box_keypair()
(не crypto_box_keypair()
) возвращает список. Так что в этом случае
my @keyPair = box_keypair();
должно работать нормально.
Хотя @Adam Millerchip показал вам, как получить доступ к нужным элементам, я прокомментирую другую часть вашей проблемы. Ты говоришь:
Мое понимание (подтверждено
Data::Dumper
)
На самом деле, такая вещь не была подтверждена Data::Dumper
, Если вы хотите увидеть, что в @keyPair
, вы должны передать ссылку на @keyPair
в Dumper
, То есть вы должны использовать
print Dumper \@keypair;
вместо
print Dumper @keypair; # I suspect you did this
Если вы передали ссылку на @keyPair
Вы бы ясно увидели, что это массив, содержащий один анонимный массив.
Вместо этого, не передавая ссылку, вы передали элементы @keyPair
в качестве аргументов Dumper
, В этом случае, @keyPair
имеет один элемент, ссылку на анонимный массив с двумя элементами. Выход из Dumper
таким образом, обманул вас в размышлениях @keyPair
было два элемента.
То есть ваш код эквивалентен:
my @x = (['a', 'b']);
print Dumper @x;
это так же, как print Dumper $x[0]
, Если вы хотите увидеть, что в @x
, вы должны передать ссылку на @x
как в:
print Dumper \@x;
Примеры:
$ perl -MData:: Dumper -e "@x = (['a', 'b']); print Dumper @x" $ VAR1 = [ "А", "Б" ];
$ perl -MData:: Dumper -e "@x = (['a', 'b']); вывести Dumper $x[0]" $VAR1 = [ "А", "Б" ];
$ perl -MData:: Dumper -e "@x = (['a', 'b']); печать Dumper \@x" $VAR1 = [ [ "А", "Б" ] ];