Igel: Regeulärer Ausruck mit Variable vom Pfad

Hallo zusammen,

ich verstehe nicht warum mein RegExp nicht funktioniert (also "Mist" ausgibt) in Variante 1, Variante 2 und Variante 3.

Variante 1:

$File_anfang="C:\ABC.1\datei";  
$File="C:\ABC.1\datei1.txt";  
  
if ($File =~ /${File_anfang}(\d+).txt$/)  
{  
print "So solls sein ! => $1";  
}  
else {print "Mist";}

Variante 2:

$File_anfang= quotemeta "C:\ABC.1\datei";  
$File="C:\ABC.1\datei1.txt";  
  
if ($File =~ /${File_anfang}(\d+).txt$/)  
{  
print "So solls sein ! => $1";  
}  
else {print "Mist";}

Variante 3:

$File_anfang= quotemeta "C:\ABC.1\datei";  
$File="C:\ABC.1\datei1.txt";  
  
if ($File =~ /\Q${File_anfang}(\d+).txt$/)  
{  
print "So solls sein ! => $1";  
}  
else {print "Mist";}

Variante 4: => FUNKTIONIERT

$File_anfang= quotemeta "C:\ABC.1\datei";  
$File="C:\ABC.1\datei1.txt";  
  
if ($File =~ /(\d+).txt$/)  
{  
print "So solls sein ! => $1";  
}  
else {print "Mist";}

Kann jemand helfen?
Danke.

Gruss
Igel

  1. Sorry, ich hab vergessen zu erwähnen, dass $File aus einem Array kommt.

    my @FILES = <*.txt>;  
    if (@FILES)  
    {  
    LOG_MESSAGE("### file found");			  
      
    foreach my $File (@FILES)  
    {  
      
    if ($File =~ /(\d+).txt$/)  
    {  
    print "So solls sein ! => $1";  
    }  
    else {print "Mist";}
    

    Und das funktioniert nicht. Mein Beispiel von oben funktioniert nämlich *upp*.

    1. Sorry, ich bin etwas durch ... also nochmal:

      $File_anfang="C:\ABC.1\datei";  
        
      my @FILES = <*.txt>;  
      if (@FILES)  
      {  
      LOG_MESSAGE("### file found");  
        
      foreach my $File (@FILES)  
      {  
        
      #$File ist C:\ABC.1\datei1.txt  
        
      if ($File =~ /${File_anfang}(\d+).txt$/)  
      {  
      print "So solls sein ! => $1";  
      }  
      else {print "Mist";}
      

      Und das geht nicht! So hoffe es ist klar nun.

      1. Hi,

        [code lang=perl]$File_anfang="C:\ABC.1\datei";

        Der \ hat in Perl-Strings eine escapende Wirkung ...
        Wenn Du explizit einen \ haben willst, mußt Du ihn escapen.
        Also "C:\ABC.1\datei";

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. [code lang=perl]$File_anfang="C:\ABC.1\datei";

          Der \ hat in Perl-Strings eine escapende Wirkung ...
          Wenn Du explizit einen \ haben willst, mußt Du ihn escapen.
          Also "C:\ABC.1\datei";

          Kann man das nicht mit "quotemeta" lösen? Dieser String wird nämlich dynamisch erzeugt [ => dirname(__FILE__) ], je nachdem wo mein Script im Dateisystem liegt.

  2. hi,

    nimm doch einfach das Modul File::Basename, fertig.

    Horst

    --
    Ich biete:
    Mobile Datenerfassung mit Tablets o.a. mobilen Endgeräten als Softwarelösung
  3. ich verstehe nicht warum mein RegExp nicht funktioniert (also "Mist" ausgibt) in Variante 1, Variante 2 und Variante 3.

    Variante 1:

    $File_anfang="C:\ABC.1\datei";

      
    erstens: immer use strict und use warnings. warnings hätte dich hier gewarnt:  
    Unrecognized escape \A passed through at ...  
    Unrecognized escape \d passed through at ...  
      
    wenn du sowas schreibst: "C:\ABC.1\datei"  
      
    dann werden die backslashes verschwinden, egal, ob du aussenrum noch quotemeta packst. es hilft nichts, denn quotemeta bekommt keine backslashes mehr zu gesicht.  
      
    zweitens: wenn irgendwas nicht so klappt, wie du denkst, also z.b. eine regex nicht matcht, dann gib dir doch den string und die regex vorher mit print aus! ich zumindest hasse es, blind zu raten.  
    dann hättest du gesehen, dass die backslashes gar nicht mehr vorhanden sind.  
      
    du musst single quotes nehmen oder wie gesagt die backslashes selbst escapen.  
      
    'C:\ABC.1\datei'  
    "C:\\ABC.1\\datei"  
      
    und wenn du das dann erstmal noch in eine normale variable packst und danach als regex verwendest, dann musst du noch ein quotemeta drumherum packen. sonst sieht die regex wiederum auch nur einen backslash.