$xNeTworKx: Seltsames Verhalten bei reg.Expr.

Hallo,
Hab ein Problem mit regulären Ausdrücken.
Ich lese eien Reihe von Files ein, und vergleiche eine Eingabe, ob diese schon mal in einem der Files vorkommt:

opendir(DIR,'users') or die "Cant open directory of users : $! \nPlease send a mail to $mailadmin to report this error\n";
  while (defined($_ = readdir(DIR)))   {
    if ($_ =~ /^\d+?.cgi$/)   {
    open(FILE,"users/$_") or die "An error occured with $_ : $!\nPlease contact $mailadmin to report this error.\n";
    flock FILE, 2;
    local $/;
    my $input = <FILE>;
    close FILE;
    encode_entities($name);
      if ($input =~ /<name>$name</name>/i)    {
      $$error = 1;
      $$nameerror = 'Der Name existiert bereits !';
      }
    }
 }
closedir DIR;

In den Files kommt Fritzi, Toni und <xNeT//orKx> vor. Der Ausdruck erkennt Fritzi, Toni, (befinden sich auf in dem Files) aber <xNeT//orKx> nicht. Deswegen hab ich auch oben encode_entities($name) gesetzt, da ja <xNeT//orKx> nicht dasselbe wie <xNeT//orKx> ist. Wenn ich zwischen <name> und </name> aber <xNeT\/\/orKx> zur Probe eingebe, erkennt er <xNeT//orKx> im File dann auch.
Wie kann ich es hinbringen, dass die Eingabe <xNeT//orKx> auf <xNeT//orKx> im File matched. Mit encode_entities($name) geht es schon mal nicht, aber warum? Wenn ich <xNeT//orKx> normalerweise über encode_entities($name) laufen lassen würde, kommt <xNeT//orKx> raus. Warum matched es hier aber nicht und wie kann ich das Problem lösen?

$xNeTworKx.

--
Mit Computern lösen wir Probleme, die wir ohne sie gar nicht hätten.
  1. Hi,

    In den Files kommt Fritzi, Toni und <xNeT//orKx> vor. Der Ausdruck erkennt Fritzi, Toni, (befinden sich auf in dem Files) aber <xNeT//orKx> nicht. Deswegen hab ich auch oben encode_entities($name) gesetzt,

    Was haben entities (& usw.) damit zu tun?
    Du mußt doch backslashes hinzufügen, nicht entities einsetzen...
    Für die / würde es ja schon helfen, nicht / als Begrenzer für den Regex zu benutzen...

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    1. Hi,

      Was haben entities (& usw.) damit zu tun?

      Weil alle Namen mit Entities abgespeichert werden und im Vorhinein kann man eben nicht wissen, welche Sonderzeichen ein Name enthält, deswegen muss ich die zu durchsuchenden Namen mit entities auch kodieren.
      <xNeT//orKx> ist also <xNeT//orKx> aber wenn ich die Eingabe <xNeT//orKx> mit encode_entities kodiere (also <xNeT//orKx>) matched es nicht auf <xNeT//orKx> im File, aber warum nicht, wenn ich nach <name>$name</name> suche? (wenn $name <xNeT//orKx>) enthält.

      $xNeTworKx.

      --
      Mit Computern lösen wir Probleme, die wir ohne sie gar nicht hätten.
  2. Tach $xNeTworKx,
    ich denke, dass Problem ist, dass Du die Sonderzeichen innerhalb des Files nicht umwandelst. Wenn Du das machst, dann funzt nämlich alles wie
    folgendes Beispielprogramm zeigt:

    -----------------------------------------------
    use HTML::Entities;
    use strict;

    my $input = 'IRGENDWELCHER KRAM<name><xNeT//orKx></name>NOCH MEHR KRAM';
    my $name  = '<xNeT//orKx>';

    encode_entities($name);

    if ( $input =~ /<name>(.*?)</name>/i )
    {
      my $input_name = $1;
      encode_entities($input_name); # INHALT AUCH UMWANDELN!!

    if ( $input_name eq $name )
      {
        print "Suppie";
      }
      else
      {
        print "Mist\n";
      }
    }
    ------------------------------------------------------
    Hoffe das hilft.
    Gruss
    Christian

    1. Hallo,
      Ich habe jetzt mal ein bisschen herumprobiert und es würde so funktionieren:

      opendir(DIR,'users') or die "Cant open directory of users : $! \nPlease send a mail to $mailadmin to report this error\n";
              while (defined($_ = readdir(DIR)))   {
                         if ($_ =~ /^\d+?.cgi$/)   {
                        open(FILE,"users/$_") or die "An error occured with $_ : $!\nPlease contact $mailadmin to report this error.\n";
                         flock FILE, 2;
                         local $/;
                        my $input = <FILE>;
                          close FILE;
                          my $inputname = $1 if $input =~ /<name>(.+?)</name>/i;
                              if (lc $name eq lc $inputname)    {
                              $$error = 1;
                              $$nameerror = 'Der Name existiert bereits !';
                               }
                          }
               }
             closedir DIR;

      $xNeTworKx.

      --
      Mit Computern lösen wir Probleme, die wir ohne sie gar nicht hätten.