Perl Beginner: Regex: In Variabel speichern und daraus anwenden

Hallo Forum

Ich google mir gerade die Finger wund, um in meinem ersten Perl "hack" auf eine grünen Zweig zu kommen:

Ich habe zwei Dateien, File1 und File2.

File1 ist immer nach folgendem Muster aufgebaut:
0x0001 Fehlerbeschreibung
Die HEX Adresse muss jedoch nicht linear inkrementiert werden, sondern kann Sprünge aufweisen.

File2 ist ähnlich aufgebaut:

0x0001 E400 Fehlerbeschreibung 1, Fehlerbeschreibung 2

Ich lese nun mittels Regex den Fehlercode der aktuellen Zeile aus File1 aus:

$FehlerTextFileZeile =~ /^0x[a-fA-F0-9]{4}/;
$HexCode = $&;

In der Variabel $&, bzw $HexCode steht dann der eigentliche Fehlercode drinn, z.B 0x0001

Nun möchte ich im File2 nach genau demselben Eintrag suchen:

$TrblMsgRow =~ /$HexCode/;

Hier stehe ich nun aber an... Wie kann ich perl mitteilen, dass ich nicht nach $HexCode suchen will, sondern nach dem Inhalt der Variabel von $HexCode?

Ich versuchte schon, $HexCode = $&; und dann beim auswerten mittels $TrblMsgRow =~ /$$HexCode/; - ohne Erfolg.

Gebe ich die Werte mittels print aus, sind die Inhalte zwar gleich. Wenn ich aber nach der entsprechenden Zeile im File2 suchen gehe, wird die Zeile leider nicht gefunden; also muss da ein Unterschied bestehen?

Wer kann mir weiterhelfen?

Besten Dank und schöne Feiertage

  1. hi,

    Wer kann mir weiterhelfen?

    Anderer Vorschlag, anstelle literarischer hex-Werte fände ich es besser, dort einen numerischen Wert zu haben mit einer konstanten Länge von 4 byte, somit kannst Du auf eine RegEx verzichten. Diese 4 byte (32 bit) kannst Du mit pack("N", $zahl); erzeugen und mit unpack() wiederherstellen. Lesen der 4 byte mit read(). Die weiteren Texte könnten auch auf eine einheitliche Länge gebracht werden, dann kannst Du in Deinen Dateien auf Zeilenumbrüche verzichten und die Daten im binmode gleich auf einen hash oder ähnliche Datenstruktur einlesen.

    Viele Grüße,
    Horst Hauser

    1. Anderer Vorschlag, anstelle literarischer hex-Werte fände ich es besser, dort einen numerischen Wert zu haben mit einer konstanten Länge von 4 byte, somit kannst Du auf eine RegEx verzichten. [...]

      Hallo Horst

      Danke für die Idee. Da die Fehlercode auch aus einem Rechner so ausgegeben werden, muss ich den Vergleich auf Basis dieses Wertes machen :(

      1. moin,

        Danke für die Idee. Da die Fehlercode auch aus einem Rechner so ausgegeben werden, muss ich den Vergleich auf Basis dieses Wertes machen :(

        Den Vergleich kannst Du vorzüglich über den numreischen Wert machen.

        Hotti

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  2. Ich habe zwei Dateien, File1 und File2.
    File1 ist immer nach folgendem Muster aufgebaut:
    0x0001 Fehlerbeschreibung
    Die HEX Adresse muss jedoch nicht linear inkrementiert werden, sondern kann Sprünge aufweisen.

    File2 ist ähnlich aufgebaut:
    0x0001 E400 Fehlerbeschreibung 1, Fehlerbeschreibung 2
    Ich lese nun mittels Regex den Fehlercode der aktuellen Zeile aus File1 aus:
    $FehlerTextFileZeile =~ /^0x[a-fA-F0-9]{4}/;
    $HexCode = $&;

    Bitte verwende $1.. mit capturing Klammern.

    Ferner möchtest du eventuell deine Files in zwei Hashes lesen, indem du deine Zeilen so parst:

    my $hexpat = qr/0x[A-Za-z0-9]{4}/;  
    my %file1;  
    while(<$fh>){  
      /^($hexpat)\s(.*)/ and $file1{$1} = $2;  
    }
    

    Sodann kannst du Hashes vergleichen.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische