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

Rob*_*ner 1 arrays perl dynamic

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

@array = split /\n/, $longstring;
$data = $array[14];
Run Code Online (Sandbox Code Playgroud)

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

$data = (split /\n/, $longstring)[14];
Run Code Online (Sandbox Code Playgroud)

这是我想做的,但在perl.

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

编辑:嗯,好吧,这个怎么样

漫漫长路

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

简短的路

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.
Run Code Online (Sandbox Code Playgroud)

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

编辑2:

我有点困惑为什么这两条线不同

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

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

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";
Run Code Online (Sandbox Code Playgroud)

这就是我期望发生的事情,有人能指出我的想法出了什么问题吗?

cjm*_*cjm 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
Run Code Online (Sandbox Code Playgroud)

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

另一方面,你永远不应该说my $amy $b. $a并且$b是与之一起使用的特殊包变量,sort如果你把它们变成词法,你就会遇到奇怪的问题.即使您目前没有使用sort,也可以稍后再添加.完全避免制作$a$b词汇是最容易的.

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

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