我正在尝试使用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
。
答案 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' ] ];