Perl primer: Daten in mehreren Zeilen

R

rikola

Foren Gott
Hallo,

ich habe eine Logdatei im Format
Code:
>>>>>>>>>>>>
tag1: Daten
tag2: Daten
        Daten
        Daten
tag3: Daten
<<<<<<<<<<<<
>>>>>>>>>>>>
tag1: andere Daten
tag2: andere Daten
        andere Daten
tag3:
<<<<<<<<<<<<
Diese Datei wuerde ich gerne mit Perl verarbeiten.

Die Datei wird mit "open (INP, "<filename");" geoeffnet und dann mit "while (<INP>)..." durchlaufen.
Dazu habe ich folgende Fragen:

Den Block zwischen ">>>>" und "<<<<" wuerde ich gerne mittels einer subroutine verarbeiten. Was muss ich da der subroutine uebergeben? Mit "$_" erfasse ich ja nur die aktuelle Zeile, oder nicht? Kann ich "INP" uebergebeb???
Die Daten von 'tag2' koennen in mehreren Zeilen stehen.

Wenn ich innerhalb der "while(<Inp>)" ein "if /tag2/" habe, wie kann ich dann in dem if-Block eine Zeile weiterspringen. Oder ist das die falsche Denkweise fuer Perl?
 
Du kannst den file descriptor (FD, oder INP wenn du willst) so übergeben:
Code:
#!/usr/bin/perl
use strict;
use warnings;

open (FD, "< test.txt");
readfile(*FD);
close FD;

sub readfile {
  *FD = shift;
  while (<FD>) {
    print;
  }
}
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

so, da bin ich wieder (muss ja zwischendurch auch mal arbeiten :-).
versuch's mal so:
Code:
#!/usr/bin/perl
use strict;
use warnings;

open (FD, "< test.txt");
while (<FD>) {
  if (/^>+$/) {
    readfile(*FD);
  }
}
close FD;

sub readfile {
  *FD = shift;
  my ($tag, $data);
  while (<FD>) {
    return if (/^<+$/);
    if (/^(tag\d+):(.*)/) {
      $tag = $1;
      $data = $2;
    } else {
      $data .= $_;
    }
    printf("%s:%s\n", $tag, $data);
  }
}
alternativ kann man die ganze Datei auch in ein Array einlesen und dann zweilenweise bzw. über den Array Index verarbeiten.
Code:
#!/usr/bin/perl
use strict;
use warnings;

open (FD, "< test.txt");
my @file = <FD>;
close FD;
for (@file) {
  print;
}
# oder
for (my $i=0;$i<$#file;$i++) {
  print $file[$i];
}
Oder du liest alles in eine skalare Variable
Code:
#!/usr/bin/perl
use strict;
use warnings;

open (FD, "< test.txt");
my $file;
while (<FD>) {
  $file .= $_;
}
close FD;
print $file;
dann kannt du das globale pattern matching nutzen:
Code:
/^(tag\d+):(.*)/mg
oder so ähnlich.
Bye,
yai.
 
Zuletzt bearbeitet:

Ähnliche Themen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

ca. 1200 PDF-Dateien auslesen und bestimmte Daten in eine CSV-Datei speichern

[perl] Doppelbuchstaben

AWK Script - Daten aus mehreren Dateien

Mailadressen aus Logdatei extrahieren

Zurück
Oben