2013-09-02 6 views

risposta

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' non ha rilevanza in sopra regex –

+0

Non ne sono assolutamente sicuro, ma penso che le corrispondenze di espressioni regolari di OP siano in contesto scalare, rendendole così iteratrici. Poiché la corrispondenza restituisce un valore booleano in contesto scalare, '==' è in realtà solo un '&&' senza cortocircuito. – amon

+0

Penso che tu abbia ragione riguardo agli iteratori –

3

Ci potrebbero essere modi più intelligenti, ma avevo appena li spezzare in prospetti separati:

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

Solo perché è perl non dovete per trovare il modo criptico più laconico a scrivi qualcosa (questo è l'APL).

0

Se la "g" e le opzioni "S" non sono realmente necessari per il vostro compito e che in realtà vogliono solo confrontare i primi sottostringhe corrispondenti, è possibile effettuare un test di una riga come segue:

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

E se avete bisogno di sapere quali sono le due stringhe corrispondenti erano, basta aggiungere alcune variabili temporanee per tenerli:

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

Ma se si vuole veramente per confrontare tutte le partite successive ogni stringa per vedere se ogni coppia è uguale, non c'è una soluzione a singola affermazione, posso pensare che lo farà. Ogni regex restituisce ciascuna una lista e "==" confronta solo la loro lunghezza. Devi usare la prima soluzione proposta sopra e scrivere il codice di confronto in "long-hand".

La seconda soluzione di cui sopra non funzionerà poiché continuerà a testare solo la prima corrispondenza in ciascuna stringa.

È un po 'difficile capire cosa si sta tentando di fare, ma si potrebbe almeno rilasciare l'opzione "i" sul primo test per/(\ d +) /. Presumibilmente, l'opzione "s" è necessaria solo per la seconda stringa poiché stai cercando le nuove linee incorporate.

Problemi correlati