4

我有以下代码:

@a = ((1,2,3),("test","hello"));
print @a[1]

我期待它打印

testhello

但它给了我2

很抱歉这个新手问题(Perl 对我来说有点不自然),但为什么会发生,我怎样才能得到我想要的结果?

4

4 回答 4

6

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'
        ];
于 2013-04-13T00:32:45.113 回答
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
于 2013-04-13T01:29:33.983 回答
3

我认为您正在寻找一系列数组。因此,您需要使用方括号创建一个数组引用数组,如下所示:

@a = ([1,2,3],["test","hello"]);

然后您可以按如下方式打印第二个数组:

print @{$a[1]};

这将为您提供您期望的输出:testhello

于 2013-04-13T00:37:58.540 回答
-4

这只是语法错误的问题:

print $a[1]
于 2013-04-13T00:25:09.447 回答