2016-06-29 102 views
1

我有一個變量$rowref->[5]其中包含字符串:Perl的正則表達式的煩惱

" 1.72.1.13.3.5 (ISU)" 

我使用XML::Twig打造修改XML文件,此變量包含的東西的版本號的信息。所以我想擺脫空白和(ISU)。我試圖用替代和XML::Twig設置屬性:

$artifact->set_att(version=> $rowref->[5] =~ s/([^0-9\.])//g) 

有趣的是什麼,我在我的輸出得到的是

<artifact [...] version="9"/> 

我不明白我在做什麼錯。我檢查了一個regular expression tester,它似乎很好。有人可以發現我的錯誤嗎?

+1

你可能想'0-9'而不是'1-9' –

+0

這是真的,我會改變這個問題。 – UsefulUserName

回答

4

s///返回值是換人它使,而你的情況是9.如果你正在使用至少perl的5.14數量,r標誌添加到替代:

如果使用「/ r」(非破壞性)選項,那麼它將在字符串副本上運行 替換,而不是返回 替換次數,它將返回副本是否發生 替換。當使用 「/ r」時,原始字符串不會更改。即使 輸入是一個對象或一個綁定變量,副本始終是一個純字符串。

否則,經過這樣一個臨時變量:

my $version = $rowref->[5]; 
$version =~ s/([^0-9\.])//g; 
$artifact->set_att(version => $version); 
+0

我必須使用5.12,因此您的解決方案非常完美。謝謝! – UsefulUserName

+0

改變正則表達式匹配回答'0-9'而不是'1-9' –

+0

@WillBarnwell謝謝,更新 – hobbs

1

的正則表達式替換更改varialbe的地方,但返回它做出了換人(1的數量沒有/g修改,如果它是成功的)。

my $str = 'words 123'; 
my $ret = $str =~ s/\d/numbers/g; 
say "Got $ret. String is now: $str"; 

你可以先做替代,$rowref->[5] =~ s/...//;,然後使用更改後的變量。