Search code examples
regexperlxml-twig

Perl regular expressions troubles


I have a variable $rowref->[5] which contains the string:

"  1.72.1.13.3.5  (ISU)"

I am using XML::Twig to build modify an XML file and this variable contains the information for the version number of something. So I want to get rid of the whitespaces and the (ISU). I tried to use a substitution and XML::Twig to set the attribute:

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

Interestingly what I got in my output was

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

I don't understand what I am doing wrong. I checked with a regular expression tester and it seems fine. Can somebody spot my error?


Solution

  • The return value of s/// is the number of substitutions it made, which in your case is 9. If you are using at least perl 5.14, add the r flag to the substitution:

    If the "/r" (non-destructive) option is used then it runs the substitution on a copy of the string and instead of returning the number of substitutions, it returns the copy whether or not a substitution occurred. The original string is never changed when "/r" is used. The copy will always be a plain string, even if the input is an object or a tied variable.

    Otherwise, go through a temporary variable like this:

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