从 Perl 匿名数组访问元素时遇到问题

Trouble accessing element from Perl anonymous array

我正在尝试使用 crypto_box_keypair 来自 Crypt::Sodium:

my @keyPair = crypto_box_keypair();

我的理解(经Data::Dumper证实)是Crypt::Sodium returns一个匿名数组:

$VAR1 = [
          'k?@ʵ????$p?-0?3',
          '?1????qRo??;???1?'
        ];

但我似乎无法访问各个元素。

say scalar @keyPair;

Returns 1,尽管 Data::Dumper?

清楚地显示了两个元素

$keyPair[1] 

undef

如果它return是数组引用,您需要使用标量来存储结果,而不是数组。

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()),return 是一个列表。那么在那种情况下

my @keyPair = box_keypair();

应该没问题。

虽然@Adam Millerchip 向您展示了如何访问您想要的元素,但我将对您问题的另一部分发表评论。你说:

My understanding (confirmed by 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 = [
          'a',
          'b'
        ];
$ perl -MData::Dumper -e "@x=(['a','b']);print Dumper $x[0]"
$VAR1 = [
          'a',
          'b'
        ];
$ perl -MData::Dumper -e "@x=(['a','b']);print Dumper \@x"
$VAR1 = [
          [
            'a',
            'b'
          ]
        ];

你做了Dumper(\@keyPair)还是Dumper(@keyPair)?我怀疑你做了后者,在这种情况下 $VAR1@keyPair 的第一个(也是唯一的)元素。如果要转储数组,请传递对它的引用;这样更容易掌握。

继续该假设,crypto_box_keypair 似乎 return 是对数组而不是多个标量的引用。因此,用法应该是

my $keyPair = crypto_box_keypair();
say scalar @$keyPair;
say $keyPair->[0];
say $keyPair->[1];