从 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];
我正在尝试使用 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];