这是我目前在我的程序中所做的事情
@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";
这就是我期望发生的事情,有人能指出我的想法出错吗?
答案 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 $a
或my $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)
你写的很好。