[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Perl hex Problem



hallo,

Die Sachlage.
ich habe viele html Dateien, aus der ich mit Perl einige Daten extrahieren möchte. Hierzu ist es notwendig, dass die Substitution s///g *zeilenübergreifend* funktioniert.

In der Datei befinden sich Zeilenende Zeichen, die von Perl nicht erkannt werden.

In einem hex Editor werden dies als 16, 32 und 64 bit unterschiedlich dargestellt. Ich kann damit wenig anfangen. Hier die Analyse des hex Editors:

Eine Zeilenende Zeichen wird wie folgt dargestellt:
Signed 8 bit: 10
Unsigned 8 bit: 0x0A
Signed 16 bit: 2570
Unsigned 16 bit: 0x0A0A

Eine weiteres Zeilenende Zeichen wird wie folgt dargestellt:
Signed 8 bit: 10
Unsigned 8 bit: 0x0A
Signed 16 bit: 2620   (oder 15370 als Little Endian)
Unsigned 16 bit: 0x0A3C  (oder 0x3C0A als Little Endian)


Hier das Perl Skript:

#!/usr/bin/perl -w
use strict;
my $verz = "/home/ft/meinVerz";
my $fileliste ;
my @fileliste;
my $filename;

# Verezichnis oeffnen
@fileliste = glob($verz."/*.html")  or die "Verzeichnisangabe falsch";
$/="";
foreach $filename (@fileliste)
{ open(FH, $filename) or die "Konnte $filename nicht öffnen\n";
  while(<FH>)
  {
    $_ =~ s|\s+| |gs;      # Leerzeichen entfernen
    $_ =~ s|.*expand.sections||si; # Marke finden
    print "$_ \n";
  };
};

Das Problem:
Steht die gesuchte Zeichenkette vor einem solchen ominösen Zeilenende Zeichen, wird der Substitutionsbefehl richtig erkannt; steht er dahinter, wird mit dem Zeilenendezeichen ein neuer Absatz definiert und die Substitution wird damit nur innerhalb des Absatzes ausgeführt.

Meine Frage:
Da   $_ =~ s/[\n|\r]+//gs;  # windows zeilenende
auch keinen Erfolg bringt, komme ich mit diesem Problem nicht weiter.

Wer hat eine Lösung?

Franz Timmer


Reply to: