2016-06-29 28 views
1

Ich habe eine Variable $rowref->[5], die die Zeichenfolge enthält:Perl reguläre Ausdrücke plagt

" 1.72.1.13.3.5 (ISU)" 

ich XML::Twig bin mit einer XML-Datei erstellen ändern und diese Variable enthält die Informationen für die Versionsnummer von etwas. Also möchte ich die Whitespaces und die (ISU) loswerden. Ich versuchte, einen Ersatz zu verwenden und XML::Twig das Attribut gesetzt:

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

Interessanter, was ich in meiner Ausgabe erhielt, war

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

Ich verstehe nicht, was ich falsch mache. Ich habe mit einer regular expression tester überprüft und es scheint in Ordnung. Kann jemand meinen Fehler finden?

+1

Sie wahrscheinlich wollen '0-9' anstelle von' 1-9' –

+0

Das stimmt, ich werde das in der Frage ändern. – UsefulUserName

Antwort

4

Der Rückgabewert von s/// ist die Anzahl der Substitutionen es gemacht, die in Ihrem Fall ist 9. Wenn Sie mindestens Perl 5.14, fügen Sie die r Flagge auf die Substitution mit:

Wenn Die Option "/ r" (nicht-destruktiv) wird verwendet, dann wird die Substitution auf einer Kopie der Zeichenfolge ausgeführt und anstelle der Anzahl der Ersetzungen wird die Kopie zurückgegeben, unabhängig davon, ob eine Ersetzung aufgetreten ist. Der ursprüngliche String wird niemals geändert, wenn "/ r" verwendet wird. Die Kopie ist immer eine einfache Zeichenfolge, auch wenn die Eingabe ein Objekt oder eine gebundene Variable ist.

Andernfalls gehen durch eine temporäre Variable wie folgt aus:

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

Ich muss 5.12 verwenden, damit Ihre Lösung perfekt ist. Vielen Dank! – UsefulUserName

+0

ändern Regex mit Antwort "0-9" anstelle von "1-9" –

+0

@WillBarnwell danke, aktualisiert – hobbs

1

Die regex Substitution der varialbe anstelle ändert aber gibt die Anzahl der Ersetzungen es (1 ohne /g Modifikator gemacht, wenn es erfolgreich war).

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

Sie können zuerst die Ersetzung vornehmen, $rowref->[5] =~ s/...//;, und dann die geänderte Variable verwenden.