1

我曾经知道如何做到这一点。我只想从一个更大的字符串中提取一个子字符串并将其分配给标量。所以这是我破解的 Perl 脚本......

#!/usr/local/bin/perl 
use warnings;
use strict;

my $thing = "thing1 thing2 thing3 thing4 thing5 thing6 thing7 thing8";
my $thing4 = ${@{split (/ /, $thing)}[3]};
print "thing4 is $thing4\n";

...我得到的输出是这个...

Use of uninitialized value $_ in split at ./perlex.pl line 6.
Can't use string ("0") as an ARRAY ref while "strict refs" in use at ./perlex.pl line 6.

...我希望输出是...

thing4 is thing4

我在这里做错了什么?

4

2 回答 2

6

你大大过度设计了这split条线。它应该只是:

my $thing4 = (split / /, $_)[3];
于 2013-09-19T21:18:02.767 回答
4

这个表达

${@{split (/ /, $_)}[3]}

方法:

  • 在所有空格处拆分$_变量。这发生在标量上下文中,因此它评估字段的数量,例如5
  • @{ ... }内部表达式视为数组引用并将其取消引用为数组,例如@5.
  • 选择该@{ ... }[3]数组的第四个元素,语法非常可疑。例如@5[3],可能是"foo",但可能是undef
  • ${ ... }其视为标量引用,并取消引用它。例如${foo}

结果:混乱。你实际上想要:

my $some_thing = (split)[3];
于 2013-09-19T21:19:15.073 回答