我有以下代码:
@a = ((1,2,3),("test","hello"));
print @a[1]
我期待它打印
testhello
但它给了我2
。
抱歉新手问题(Perl对我来说有点不自然),但为什么会发生这种情况,我怎样才能得到我想要的结果呢?
答案 0 :(得分:6)
Perl构造@a
的方式与你的写作相同,
@a = (1,2,3,"test","hello");
这就是为什么当你通过写1
(真的应该是@a[1]
)来索引$a[1]
索引时的值时,你会得到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'
];
答案 1 :(得分:6)
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
答案 2 :(得分:3)
我认为你是在一组数组之后。因此,您需要使用方括号创建数组引用数组,如下所示:
@a = ([1,2,3],["test","hello"]);
然后你可以按如下方式打印第二个数组:
print @{$a[1]};
这将为您提供您期望的输出:testhello
答案 3 :(得分:-4)
这只是一个错误的语法问题:
print $a[1]