2009-06-04 3 views
1

Ich versuche, einen regulären Ausdruck in Perl zu finden, der mehrere Muster abgleicht und alle wie preg_match_all in PHP zurückgibt.Wie kann ich einen globalen regulären Ausdruck in Perl erstellen?

Hier ist, was ich habe:

$str = 'testdatastring'; 
if($str =~ /(test|data|string)/) { 
     print "its found index location: $0 $-[0]-$+[0]\n"; 
     print "its found index location: $1 $-[1]-$+[1]\n"; 
     print "its found index location: $2 $-[2]-$+[2]\n"; 
     print "its found index location: $3 $-[3]-$+[3]\n"; 
} 

Das gibt mir nur das erste Spiel, das in dieser ist ‚Test‘. Ich möchte in der Lage sein, alle Vorkommen von bestimmten Mustern zu vergleichen: 'test', 'data' und 'string'.

Ich weiß, dass in PHP, können Sie preg_match_all für diese Art von Zweck verwenden:

if(preg_match_all('/(test|data|string)/', 'testdatastring', $m)) { 
     echo var_export($m, true); 
} 

Der obige PHP-Code würde alle 3 Strings entsprechen: 'test', 'Daten' und 'string'.

Ich möchte wissen, wie man das in Perl macht. Jede Hilfe würde sehr geschätzt werden.

Antwort

10

Das Perl entspricht

preg_match_all('/(test|data|string)/', 'testdatastring', $m) 

ist

@m = ("testdatastring" =~ m/(test|data|string)/g); 

Das/g-Flag für globale steht, Es gibt also eine Liste von Übereinstimmungen im Listenkontext zurück.

+0

Wie wenden Sie das in einer if/else-Anweisung an? – Carel

+0

Hat es geschafft: if (@list = $ str = ~ Regex) {True} {False} benutze/regex/g um die gefundenen Items in der Liste zu gruppieren. – Carel