2016-06-29 2 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

изменить regex в соответствии с ответом '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/...//;, а затем использовать измененную переменную.

Смежные вопросы