如何获得子数组?

时间:2013-04-13 00:17:21

标签: perl

我有以下代码:

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

我期待它打印

testhello

但它给了我2

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

4 个答案:

答案 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]