我正在使用Perl中的正则表达式从一行中提取第一个单词
for my $source_line (@lines) {
$source_line =~ /^(.*?)\s/
}
但我想将第一个单词存储到变量
中当我打印下面的代码时,我得到正确的输出
print($source_line =~ /^(.*?)\s/)
当我想要存储在$ i中并打印它时,我输出为1.
my $i = ($source_line =~ /^(.*?)\s/);
print $i;
如何将第一个单词存储到临时变量
答案 0 :(得分:2)
您需要在列表上下文中评估匹配。
my ($i) = $source_line =~ /^(.*?)\s/;
my ($i)
与(my $i)
相同,“看起来像列表”,因此它会导致=
成为列表赋值运算符,列表赋值运算符会在其中评估其RHS列表上下文。
顺便说一下,即使只有一件作品,并且有领先的空白,以下版本也能正常工作:
my ($i) = $source_line =~ /(\S+)/;
答案 1 :(得分:1)
这一切都归结为语境,这个表达:
$source_line =~ /^(.*?)\s/
返回匹配列表。
在列表上下文中评估列表时,您将获得列表本身。在标量上下文中评估列表时,您将获得列表的大小;这就是这里发生的事情。
所以将lhs表达式更改为列表上下文:
my ($i) = $source_line =~ /^(.*?)\s/;
正确捕捉这个词。
最近有一些关于Perl Weekly的文章与上下文相关,其中一篇文章特别好:http://perlhacks.com/2013/12/misunderstanding-context/