Sebastian Nagel: Offsetadessen der Dateizeilen einlesen

Hi Leute, ich hab ein Problem mit einem meiner Scripts.
Ich versuche mittels dieses Codes die Offsetnummern der Zeilen einer Datei einzulesen:

open(DATAIN, "<../guest.data");
 @Daten = <DATAIN>;
 $hexoffset[0] = tell(DATAIN);
 while(<DATAIN>)
  {
  $i++;
  $hexoffset[$i] = tell(DATAIN);
  }
 close(DATAIN);

Das Problem ist nur, dass danach der Array nichts enthält (bzw. nur die Zelle Nr. 0 hat danach einen zugewiesenen Wert)

Der Beispiel-Code von Self-HTML klappt auch nicht - der Server bringt wiedermal den vielsagenden Fehler: a Error ocurred....

Hier noch mal kurz der Beispielcode, damit ihr nicht zu lange suchen müßt:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

my $Datei = "/usr/info/readme.txt";
my @Zeilenanfaenge = "";
open(DATEI, "<$Datei") || die "$Datei: $!";
$Zeilenanfaenge[0] = tell(DATEI);
my $i = 0;
while(<DATEI>) {
   $i++;
   $Zeilenanfaenge[$i] = tell(DATEI);
}
close(DATEI);
$i = 1;
print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Testausgabe</title></head><body>\n";
foreach (@Zeilenanfaenge) {
   print "Zeile $i beginnt in der Datei bei Offset $_<br>\n";
   $i++;
}
print "</body></html>\n";

  1. Hallo Sebastian,

    Zunächst mal: du hast 'use strict;' vergessen. Entsprechend hast du auch die ganzen my
    vergessen.

    open(DATAIN, "<../guest.data");
    @Daten = <DATAIN>;

    Hier ist der Datei-Zeiger bereits am Ende der Datei angekommen. Deshalb...

    $hexoffset[0] = tell(DATAIN);
    while(<DATAIN>)
      {
      $i++;
      $hexoffset[$i] = tell(DATAIN);
      }
    close(DATAIN);

    Wird die Schleife auch nie durchlaufen. Besser so:

    open DATAIN, '<', '../guest.data' or die $!;
    my @offsets = (0);

    while(<DATAIN>) {
      push @offsets,tell(DATAIN);
    }

    close DATAIN;

    @offsets enthält dann die Datei-Adressen der Zeilen. Brauchst du gleichzeitig auch noch
    alle Zeilen der Datei, musst du sie halt per push() in einen zweiten Array packen oder so.

    Grüße,
     CK

    --
    Ihr wisst nicht, wie man den Menschen dient. Wie sollt ihr wissen, wie man den Goettern dienen soll?