从句子中提取第一个单词并存储它

时间:2014-01-16 14:06:47

标签: regex perl

我正在使用Perl中的正则表达式从一行中提取第一个单词

for my $source_line (@lines) {
    $source_line =~ /^(.*?)\s/
}

但我想将第一个单词存储到变量

当我打印下面的代码时,我得到正确的输出

print($source_line =~ /^(.*?)\s/)

当我想要存储在$ i中并打印它时,我输出为1.

my $i =  ($source_line =~ /^(.*?)\s/);
print $i;

如何将第一个单词存储到临时变量

2 个答案:

答案 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/