我有以下代码:
@a = ((1,2,3),("test","hello"));
print @a[1]
我期待它打印
testhello
但它给了我2
。
很抱歉这个新手问题(Perl 对我来说有点不自然),但为什么会发生,我怎样才能得到我想要的结果?
我有以下代码:
@a = ((1,2,3),("test","hello"));
print @a[1]
我期待它打印
testhello
但它给了我2
。
很抱歉这个新手问题(Perl 对我来说有点不自然),但为什么会发生,我怎样才能得到我想要的结果?
Perl 的构造方式@a
相当于你的写作,
@a = (1,2,3,"test","hello");
这就是为什么当你1
通过写作@a[1]
(真的应该是$a[1]
)询问 index 处的值时,你会得到2
. 为了证明这一点,如果您要执行以下操作,
use strict;
use warnings;
my @a = ((1,2,3), ("test","hello"));
my @b = (1,2,3,"test","hello");
print "@a\n";
print "@b\n";
两者都打印同一行,
1 2 3 test hello
1 2 3 test hello
你想要的是在你的数组中创建匿名数组 - 像这样,
my @c = ([1,2,3], ["test","hello"]);
那么,如果你写下以下内容,
use Data::Dumper;
print Dumper $c[1];
你会看到这个打印出来的,
$VAR1 = [
'test',
'hello'
];
Perl 列表只是一维的,这意味着(1,2,(3,4))
会自动展平为(1,2,3,4)
. 如果您想要一个多维数组,则必须对第一个以外的任何维度使用引用(存储在标量中)。
您可以使用括号表示法获取任何匿名数组引用,也可以[1,2,3,4]
使用反斜杠引用现有数组my $ref = \@somearray
。
所以一个结构如是my $aref = [1,2,[3,4]]
一个数组引用,其中引用数组的第一个元素是 1,第二个元素是 2,第三个元素是另一个数组引用。
(我发现在使用多维数组时,即使对第一个维度使用引用也不会那么混乱,但my @array = (1,2,[3,4])
也很好。)
顺便说一句,当您对 perl 引用进行字符串化时,您会得到一些指示引用类型和内存位置的乱码,例如“ARRAY(0x7f977b02ac58)”。
使用 取消引用对数组的数组引用@
,或使用 获取引用的特定元素->
。
例子:
my $ref = ['A','B',['C','D']];
print $ref; # prints ARRAY(0x001)
print join ',', @{$ref}; # prints A,B,ARRAY(0x002)
print join ',', @$ref; # prints A,B,ARRAY(0x002) (shortcut for above)
print $ref->[0]; # prints A
print $ref->[1]; # prints B
print $ref->[2]; # prints ARRAY(0x002)
print $ref->[2]->[0]; # prints C
print $ref->[2][0]; # prints C (shortcut for above)
print $ref->[2][1] # prints D
print join ',', @{$ref->[2]}; # prints C,D
我认为您正在寻找一系列数组。因此,您需要使用方括号创建一个数组引用数组,如下所示:
@a = ([1,2,3],["test","hello"]);
然后您可以按如下方式打印第二个数组:
print @{$a[1]};
这将为您提供您期望的输出:testhello
这只是语法错误的问题:
print $a[1]