0

我正在尝试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

4

3 回答 3

6

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

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

当您这样做时my @keyPair=crypto_box_keypair();,您将整个数组引用分配给新数组的第一个元素,这就是大小为 1 的原因,并且您可以在转储它时看到内容。

根据文档box_keypair()(not crypto_box_keypair()) 确实返回了一个列表。所以在那种情况下

my @keyPair = box_keypair();

应该可以正常工作。

于 2017-05-03T11:59:02.000 回答
1

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

我的理解(由 证实Data::Dumper

事实上,没有这样的事情得到证实Data::Dumper。如果您想查看 中的内容,您必须传递对to@keyPair的引用。也就是说,您必须使用@keyPairDumper

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']);打印 Dumper @x"
$VAR1 = [
          '一个',
          'b'
        ];
$ perl -MData::Dumper -e "@x=(['a','b']);打印 Dumper $x[0]"
$VAR1 = [
          '一个',
          'b'
        ];
$ perl -MData::Dumper -e "@x=(['a','b']);打印 Dumper \@x"
$VAR1 = [
          [
            '一个',
            'b'
          ]
        ];
于 2017-05-03T13:05:38.877 回答
1

你做了Dumper(\@keyPair)还是Dumper(@keyPair)?我怀疑你做了后者,在这种情况下$VAR1@keyPair. 如果要转储数组,请传递对它的引用;掌握这种方式要容易得多。

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

my $keyPair = crypto_box_keypair();
say scalar @$keyPair;
say $keyPair->[0];
say $keyPair->[1];
于 2017-05-03T13:51:42.943 回答