2014-01-16 25 views
0

我從一個線在Perl從一個句子中提取第一個字,並將其存儲

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

使用正則表達式提取第一個字,但我想第一個字存儲到一個變量

當我打印了下面的代碼,我得到正確的輸出

print($source_line =~ /^(.*?)\s/) 
時,我想存儲在$ i和打印

,我得到的輸出爲1

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

如何將第一個詞存儲到臨時變量中

回答

2

您需要評估列表上下文中的匹配。

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

my ($i)相同(my $i),其中「看起來像列表」,所以它會導致=是列表賦值運算符,並且列表賦值運算符評估其RHS在列表環境。


順便說一句,以下版本的作品,即使只有一個工作,當有前導空格:

my ($i) = $source_line =~ /(\S+)/; 
+0

thanks..works罰款:

有最近與上下文相關的關於Perl每週幾篇文章,這裏就是其中之一,這是特別好。 –

+0

不會有任何領先的空間,這是你使用/^(.*?)\s/,但你是正確的使用/(\ S +)/ –

+0

然後你可以使用'/ ^(\ S +)/'因爲它的自我記錄方面,但它實際上將與'/(\ S +)/' – ikegami

1

這一切都歸結到上下文,這個表達式:

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

返回匹配列表。

當您評估列表上下文中的列表時,您將列表本身返回。當您在標量上下文中評估列表時,您會返回列表的大小;這就是發生在這裏的事情。

因此改變你的LHS表達是在列表環境:

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

正確地抓住了字。現在http://perlhacks.com/2013/12/misunderstanding-context/

+0

一樣感謝文章。 –

相關問題