2016-06-29 52 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/...//;,然后使用更改后的变量。