无法从Perl匿名数组访问元素

时间:2017-05-03 11:52:17

标签: perl libsodium

我正在尝试使用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 个答案:

答案 0 :(得分:6)

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

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();

应该可以正常工作。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

虽然@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 = [
          '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'
          ]
        ];