Reinim: RegEx mit dynamischen Daten

Hallo!

Ich habe eine Liste, die immer 2 Einträge pro Listenelement hat:

@Liste1 = ("Code1,Name1 (Zusatz1)","Code2,Name2 (Zusatz2)");

Nun möchte ich zu einem Namen inkl. Zusatz anhand der Liste den zugehörigen Code suchen, also eine Suche mit $Name="Name2 (Zusatz2)" soll $Code="Code2" liefern.
Ich dachte mir nun, dies mit einer Schleife und einer RegEx-Abfrage zu lösen:

$Name = "Name2 (Zusatz2)";
foreach (@Liste1) {
   if ( $_ =~ /(.+),$Name/) {
      $Code = $1;
   }
}

Das Problem hier sind die Klammern in "Name2 (Zusatz2)": Diese werden, dynamisch in die RegEx eingesetzt, leider nicht als Zeichen Klammer verwendet, sonder mit der RegEx-Sonderbedeutung für die Gruppierung von Teilausdrücken.

Dies ist hier völlig unerwünscht. $Name wird selbst dynamisch erzeugt , und ich möchte nicht alle Zeichen mit RegEx Sonderbedeutung erst vorher maskieren müßen (hier etwa \( und \).

Gibts da Alternativen, bzw. überhaupt eine andere Lösung für derartigen Suchen in Listen?

  1. gudn tach!

    $Name = "Name2 (Zusatz2)";
    foreach (@Liste1) {
       if ( $_ =~ /(.+),$Name/) {
          $Code = $1;
       }
    }

    Das Problem hier sind die Klammern in "Name2 (Zusatz2)": Diese werden, dynamisch in die RegEx eingesetzt, leider nicht als Zeichen Klammer verwendet, sonder mit der RegEx-Sonderbedeutung für die Gruppierung von Teilausdrücken.

    Dies ist hier völlig unerwünscht. $Name wird selbst dynamisch erzeugt , und ich möchte nicht alle Zeichen mit RegEx Sonderbedeutung erst vorher maskieren müßen (hier etwa \( und \).

    das kann perl fuer dich uebernehmen:
    http://faq.perl.org/perlfaq6.html#How_can_I_quote_a_va
    http://perldoc.perl.org/perlre.html (nach "\Q" suchen)

    Gibts da Alternativen, bzw. überhaupt eine andere Lösung für derartigen Suchen in Listen?

    grep

    prost
    seth

    1. Vielen Dank für Deine Tips!

      http://faq.perl.org/perlfaq6.html#How_can_I_quote_a_va
      http://perldoc.perl.org/perlre.html (nach "\Q" suchen)

      hat mir erst vollständig geholfen, nachdem ich gecheckt habe, dass man in der Regex folgende Maskierungen z.B. \t mit \E dann erst wieder aktivieren muss ;-)

      grep

      hätte dazu noch eine Frage:

      @Datensatz = grep(/(.+),\Q$Name/, @Liste1);

      Es wird hier ja zunächst mal der gesamte, übereinstimmende Datensatz geliefert, ich bräuchte davon aber nur den geklammerten Ausdruck. Ist dies in einem Schritt möglich, oder muß ich den Klammerinhalt mit einer folgenden Regex aus @Datensatz extrahieren?

      1. gudn tach!

        http://faq.perl.org/perlfaq6.html#How_can_I_quote_a_va
        http://perldoc.perl.org/perlre.html (nach "\Q" suchen)

        hat mir erst vollständig geholfen, nachdem ich gecheckt habe, dass man in der Regex folgende Maskierungen z.B. \t mit \E dann erst wieder aktivieren muss ;-)

        ok, der hinweis auf perldoc perlre haette wohl deutlicher sein muessen.

        @Datensatz = grep(/(.+),\Q$Name/, @Liste1);

        Es wird hier ja zunächst mal der gesamte, übereinstimmende Datensatz geliefert, ich bräuchte davon aber nur den geklammerten Ausdruck. Ist dies in einem Schritt möglich, oder muß ich den Klammerinhalt mit einer folgenden Regex aus @Datensatz extrahieren?

        wenn egal waere, dass $Liste1 geschrottet wird:

        @Datensatz = grep s/(.+),\Q$Name/$1/, @Liste1;

        prost
        seth

        1. Hi

          wenn egal waere, dass $Liste1 geschrottet wird:

          und falls @Liste1 überleben soll, dann grep's "Zwillingsbruder" map bequemen:

            
          @Liste1 = ("Code1,Name1 (Zusatz1)","Code2,Name2 (Zusatz2)");  
          $Name = "Name2 (Zusatz2)";  
          @Datensatz = map {/(.+),/} grep {/\Q$Name/} @Liste1;  
          print @Datensatz;  
          
          

          prost

          rülps :)
           Kurt