2014-09-23 30 views
1

所以這是該方案:搜索兩個方向Perl的正則表達式,並存儲在一個聲明的變量

  1. 我在一根繩子上執行一個Perl的正則表達式搜索,並將其存儲在一個變量
  2. 然後我想要檢索的子串從該變量,並保存在相同的變量

當我嘗試使用兩個單獨的變量它的作品,但我想最小化我的變量聲明。目前的工作是什麼:

my ($temp1)   = ($buildLog =~ /(build\_version.*\d*)/); 
my ($buildVersion) = ($temp1 =~ /(\d.*)/); 

print "$temp1\n"; #$temp1 contains: build_version = 1411450178 

print "$buildVersion\n"; #$buildVersion contains: 1411450178 

但是,當我嘗試用一​​個變量來做到這一點,只打印出1,即它找到了比賽,但我想實際值。請看下圖:

my ($temp2)  = ($buildLog =~ /(build\_version.*\d*)/); 
$temp2   = ($temp2 =~ /(\d.*)/); 

print "$temp2\n"; #$temp1 just prints out 1 

有誰請提供行爲的快速explination,如果它確實有可能只使用一個變量來獲得搜索的內容?

感謝, CJ需要

回答

2

只有一個正則表達式:

use strict; 
use warnings; 

my $buildLog = 'foobar build_version = 1411450178 bazbiz'; 

my ($buildVersion) = $buildLog =~ /build_version\D*(\d+)/; 

print "$buildVersion\n"; 

輸出:

1411450178 
+0

謝謝!我完全忽略了這樣一個事實,即可以使用括號。 :D – sSmacKk 2014-09-23 23:50:28

0

以下

my ($temp2)  = ($buildLog =~ /(build\_version.*\d*)/); 
($temp2)  = ($temp2 =~ /(\d.*)/); 

將打印

1411450178 
2

This answer對於您要做的事情有正確的解決方案。我只是想提供一個快速解釋爲什麼你的代碼不能按照你的預期工作。

您正在混淆標量和列表模式。您的代碼

$temp2   = ($temp2 =~ /(\d.*)/); 

正在取得匹配結果(在列表上下文中)並將其分配給標量。這將列表中元素的數量分配給標量。

你也可以使用了

$temp2   = ($temp2 =~ /(\d.*)/)[0]; 

拿起的第一場比賽的結果。

@ jm666的答案有效,因爲它將匹配結果列表分配給變量列表。

+0

非常感謝:D這對我理解它的工作原理有很大的幫助:D – sSmacKk 2014-09-24 18:23:17

相關問題