2013-09-02 6 views
7

Ich bin eine while-Schleife mit zwei getrennten regulären Ausdruckdas Spiel Inhalt von zwei verschiedenen regexp in Perl

while(($string1=~m/(\d+)/igs)==($string2=~m/([^^]*?)\n+/igs)) {} 

den Wert der Anpassungsmuster des $ string1 zu speichern i $temp1=$1 verwendet haben,

Wie kann ich speichern Sie die passenden Muster der $string2. Bitte geben Sie einen Vorschlag.

Antwort

5
my ($m1,$m2); 
while (do{ 
    ($m1,$m2) =(); 
    $m1 = $1 if $string1 =~ /(\d+)/igs; 
    $m2 = $1 if $string2 =~ /([^^]*?)\n+/igs; 
    defined $m1 == defined $m2; 
}) { 
    # print "$m1-$m2-\n"; 
} 
+0

'/ is' hat keine Bedeutung in über reguläre Ausdrücke –

+0

ich nicht absolut sicher bin, aber ich denke, OP regex Spiele in Skalarkontext sind - damit sie Iteratoren machen. Als passende einen Booleschen Wert in Skalarkontext zurückgibt, die '==' ist eigentlich nur ein '' && ohne Kurzschlüsse. – amon

+0

Ich glaube, Sie über Iteratoren recht –

3

Es könnte mehr clevere Möglichkeiten, aber ich würde sie nur in einzelne Aussagen brechen:

while (1) { 
    $res1 = $string1=~m/(\d+)/igs; 
    $temp1 = $1; 
    $res2 = $string2=~m/([^^]*?)\n+/igs 
    $temp2 = $1; 
    last unless $res1 == $res2; 
    ... 
} 

Nur weil es Perl Sie nicht müssen die meisten kurz und bündig, kryptische Art und Weise zu finden schreibe etwas (dafür steht APL).

0

Wenn die „g“ und „s“ Optionen sind nicht wirklich Ihre Aufgabe notwendig und man eigentlich nur den ersten passenden Teil vergleichen will, können Sie einen einzeiligen Test machen, wie folgt:

if (($a =~ /regex1/)[0] == ($b =~ regex2/)[0]) { 
    ... 

Und wenn Sie müssen wissen, was die beiden abgestimmten Saiten waren, fügen Sie einfach einige temporäre Variablen, sie zu halten:

if (($first = ($a =~ /regex1/)[0]) == ($second = ($b =~ regex2/)[0])) { 
    ... 

Aber wenn Sie wirklich wollen, dass alle der aufeinander folgenden Spiele vergleichen in jede Zeichenfolge, um zu sehen, ob jedes Paar gleich ist, gibt es keine einzige Aussage Lösung, die ich mir vorstellen kann, wird es tun. Ihre Regexes geben jeweils eine Liste zurück und "==" vergleicht nur ihre Längen. Sie müssen die erste vorgeschlagene Lösung verwenden und den Vergleichscode in "long-hand" schreiben.

Die zweite Lösung wird über nicht funktionieren, da es Tests hält nur die erste Übereinstimmung in jeder Saite.

Es ist ein bisschen schwer zu verstehen, was Sie versuchen, das „i“ -Option auf dem ersten Test für/(\ d +)/zu tun, aber Sie zumindest fallen könnten. Vermutlich wird die Option "s" nur für die zweite Zeichenfolge benötigt, da Sie nach eingebetteten neuen Zeilen suchen.

Verwandte Themen