2017-05-03 62 views
0

我试图使用crypto_box_keypairCrypt::Sodium麻烦从Perl的匿名数组访问元素

my @keyPair = crypto_box_keypair(); 

我的理解(由Data::Dumper确认)是Crypt::Sodium返回一个匿名数组:

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

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

say scalar @keyPair; 

返回1,尽管两个元件被明确地示出Data::Dumper

而且

$keyPair[1] 

undef

+0

你做'倾销者(\ @ keyPair)'或'倾销者(@keyPair)'?我怀疑你做了后者,在这种情况下'$ VAR1'是'@ keyPair'的第一个(也是唯一的)元素。 – ikegami

+0

您的值可以通过$ keyPair [0] [0]和$ keyPair [0] [1]来访问。 – Borodin

回答

2

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

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

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

Dumper(@keyPair)的确如此!感谢您指出并解释错误或我的方式! –

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

应该可以正常工作。

+0

虽然这是正确的,文档说它返回一个列表。 – simbabque

+0

'box_keypair',确实。看起来OP正在使用'crypto_box_keypair',它没有记录并返回arrayref。更新了答案以澄清。 –

+0

这不是无证的。这是[基础XS实施](https://metacpan.org/source/MGREGORO/Crypt-Sodium-0.11/Sodium.xs#L526)。用Perl编写的'box_keypair'函数调用'crypto_box_keypair'和[取消引用返回的数组ref](https://metacpan.org/source/MGREGORO/Crypt-Sodium-0.11/lib/Crypt/Sodium。下午#L262)。 – simbabque

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' 
      ] 
     ];
+0

非常有用附加背景。谢谢。 –

+2

感谢您承认我的回答:-) –