Проблема с доступом к элементу из анонимного массива 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 = [
          [
            "А",
            "Б"
          ]
        ];
Другие вопросы по тегам