Perl正则表达式麻烦

时间:2016-06-29 19:28:49

标签: regex perl xml-twig

我有一个变量$rowref->[5],其中包含字符串:

"  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,看起来很好。有人可以发现我的错误吗?

2 个答案:

答案 0 :(得分:4)

s///的返回值是它所做的替换次数,在您的情况下为9.如果您至少使用perl 5.14,请添加r标志为替换:

  

如果使用“/ r”(非破坏性)选项,则运行   替换字符串的副本而不是返回   替换次数,无论是否返回副本   发生了替代。原始字符串永远不会更改   使用“/ r”。副本将始终是一个纯字符串,即使是   input是一个对象或一个绑定变量。

否则,请通过这样的临时变量:

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

答案 1 :(得分:1)

正则表达式替换会更改变量,但返回它所做的替换次数(1没有/g修饰符,如果成功的话)。

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

您可以先进行替换,$rowref->[5] =~ s/...//;,然后使用更改的变量。