perl,如何使用数组而不先将其赋值给变量?

时间:2010-12-18 10:46:34

标签: arrays perl dynamic

这是我目前在我的程序中所做的事情

@array = split /\n/, $longstring;
$data = $array[14];

我真的只想将数组中的元素从数组中取出并使用它,字符串中的其他内容对我没用。我知道用java这样的语言我可以做这样的事情

$data = (split /\n/, $longstring)[14];

这是我想做的事情,但在perl。

那么如何在不必先将数组赋值给变量的情况下访问数组元素呢?

编辑:嗯,好吧,这个

漫长的道路

my $data = "abc\nd^e^f\nghi";
my @a = split (/\^/, (split /\n/, $data)[1]);
print $a[2];
__OUTPUT__
f

简短的方法

my $data = "abc\nd^e^f\nghi";
my $a = split (/\^/, (split /\n/, $data)[1])[2]; # line 60
print $a;
__OUTPUT__
syntax error at script.pl line 60, near ")["
Execution of script.pl aborted due to compilation errors.

这让我比平常更困惑,因为它适用于内部分裂,但不适用于外部分裂

编辑2:

我有点困惑为什么这两行是不同的

my $a = (split  /\^/, (split /\n/, $data)[1])[2]; # works
my $a =  split (/\^/, (split /\n/, $data)[1])[2]; # doesnt

这是我对第二行的思考过程,这是我最初写的(换句话说,这就是我认为我的程序正在做的事情)

my $data = "abc\nd^e^f\nghi";
my $a =  split (/\^/, (split /\n/, $data)[1])[2];
my $a =  split (/\^/, ("abc", "d^e^f", "ghi")[1])[2];
my $a =  split (/\^/, "d^e^f")[2];
my $a =  ("d", "e", "f")[2];
my $a =  "f";

这就是我期望发生的事情,有人能指出我的想法出错吗?

3 个答案:

答案 0 :(得分:8)

我将解释为什么这些线条不同:

my $r = (split  /\^/, (split /\n/, $data)[1])[2]; # works
my $r =  split (/\^/, (split /\n/, $data)[1])[2]; # syntax error
my $r = (split (/\^/, (split /\n/, $data)[1]))[2]; # but this works

在Perl中,您可以在括号中的列表中使用类似[2]的数组下标(称为list slice)。但是还有另一条规则说:“如果它看起来像一个函数调用,它就是一个函数调用。”也就是说,当你有一个函数的名称(如split)后跟可选的空格和一个左括号时,它就是一个函数调用。你不能下标函数调用;你需要在它周围添加一组额外的括号。这就是我的第三条线工作的原因。

另一方面,您不应该说my $amy $b$a$b是与sort一起使用的特殊包变量,如果您将它们转换为词汇,则会出现奇怪的问题。即使您目前没有使用sort,也可以稍后添加。完全避免使$a$b词汇变得最简单。

为了便于阅读,我可能会稍微调整一下空白并添加注释:

my $r = (split /\^/, (split /\n/, $data)[1] )[2]; # get 3rd field of 2nd line

答案 1 :(得分:4)

你刚刚错放了第一个(,试试这个:

my $a = (split/\^/, (split /\n/, $data)[1])[2];

答案 2 :(得分:1)

你写的很好。

Here's a demo at codepad