2017-11-17 1 views
-2

Es gibt eine Konfigurationsdatei, die vom Benutzer bereitgestellte Muster enthält. Grundsätzlich kann das Muster alles sein, eine Kombination aus Buchstaben, Zahlen, Leerzeichen, Klammern, die nicht unbedingt geschlossen werden müssen, und Sonderzeichen. Muster zum Beispiel: <Error my (error** fail& 345% ?+[+?>Wie kann man komplexe unbekannte Muster in Perl abgleichen, wenn das Muster in einer Variablen ist?

Ich bin sehr neu zu Perl und kämpfen, damit umzugehen.

mein Stück Code:

for (<FH>) { 
    for (my $j = 0 ; $j < $num_pat ; $j = $j + 1) { 
     print "This is the pattern : $pat_array[$j] \n"; 
     if ($_ =~ m/'$pat_array[$j]'/) { 
      print "$_ : match found for $pat_array[$j] \n"; 
      #print "KPI for the pattern is : $kpi_array[$match] : array style \n"; 
      $match_count[$j] = ($match_count[$j] + 1); 
     } 
    } 
} 

Pattern Array hat mehrere Muster. Ich versuche, Übereinstimmungen zu finden mit: if ($ _ = ~ m/'$ pat_array [$ j]' /) Es funktioniert für einfache Muster, aber nicht für die in Beispiel.

Bitte helfen Sie mir, weiter zu gehen.

+0

Um eine sinnvolle Antwort geben zu können, warum Ihr Muster nicht übereinstimmt, benötigen wir einige Beispieldaten, die wir Ihnen dann möglicherweise mitteilen können. Ich würde sagen, wahrscheinlich, weil du '$ pat_array [$ j]' zitierst, aber es könnte sein, dass du Meta-Zeichen nicht richtig entkommst. – Sobrique

+0

Das Beispiel, das du angegeben hast, ist definitiv kein gültiger Regex - "**" ist definitiv nicht erlaubt ohne entgangen zu sein –

+0

Ich stimme diese Frage als unklar ab, denn was du dort hast, ist kein "komplexes unbekanntes Regex Muster" Es ist einfach kein gültiger Regex. Es ist nicht klar, was Sie damit zu tun haben oder was Sie wollen. – melpomene

Antwort

2

Sie müssen die Sonderzeichen angeben. Siehe perldoc -f quotemeta

Sie auch die Kurz \Q$variable\E Syntax so verwenden können:

if ($string =~ m/\Q$pattern\E/) { ... } 

Alle Sonder char buchstäblich jetzt wird abgestimmt.

+1

Oder wenn Sie nur nach einem Teilstring suchen, 'index'. – melpomene

+0

Vielen Dank tinita :) – Ansh007

Verwandte Themen