Nur eine Zeile aus einer Datei lesen

Hi :smile:
ich hab nen Problem gerade. wie kann ich mit Perl nur eine bestimmte Zeile aus einer Datei lesen? Ich will nicht immer gleich die ganze Datei einlesen, wenn ich doch nur eine bestimmte Zeile brauche…
normalerweise lese ich Dateien immer so ein:

open(FILE, ") {
push(@fileinhalt,$_);
}
close(FILE);

so schmeiss ich aber immer gleich alles in den Array. Und wie würde ich jetzt z.B. Zeile 5 einlesen und in einen Skalar schreiben? Die Zeile die ich haben will weiss ich ja auch. Jetzt muss ich nur noch wissen, wie ich das dem Perl beibringe.

tnx,
Martin

sub getline { #filename, linenr
 open INF, $\_[0]; for ($i=0; $i); close INF; return $\_;
} 
$l=getline("file.txt",5);

mhhh, egal wie ich es gedreht habe, Dein Code funktioniert nicht ganz :frowning: ich bekomme nie irgendwas zurück … nur eine leere Variable, obwohl in der Zeile etws drinne steht. Also habe ich jetzt erstmal die Geschichte so gelöst:

sub readline {
 open(FILE, ";
 close(FILE);
 return $fileinhalt[$\_[1]];
}
$zeile = &readline("file.txt",5);

funktioniert auch, aber eben nur wieder über den Umweg, erst alles in einen Array zu schreiben und dann nur den entsprechenden Array Teil zurückzugeben. Ich weiss nur nicht, ob sowas nicht unnötig viel Serverlast fabriziert. Oder?

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

funktioniert auch, aber eben nur wieder über den Umweg, erst
alles in einen Array zu schreiben und dann nur den
entsprechenden Array Teil zurückzugeben. Ich weiss nur nicht,
ob sowas nicht unnötig viel Serverlast fabriziert. Oder?

Hm, naja nicht unbedingt, aber du liest halt mehr Zeilen ein als nötig, z.b. wenn eine Datei 1000 Zeilen hat und du willst Nr. 5 dann ist das nicht gerade effizient :smile:

Kannste nicht einfach ne for-schleife machen, die die Zeilen davor einmüllt? Ich glaube darauf hat auch der andere Vorschlag abgezielt.

$zeile = 5;
for ($i=1; $i ;
}
$diezeiledieichwill = ;

mfg Bru

hi,

$zeile = 5;
for ($i=1; $i ;
}
$diezeiledieichwill = ;

Also ich weiss jetzt nicht, ob ich mich zu blöde anstelle oder nicht :wink: aber ich kann mich bei eurem Code auf den Kopf stellen, er funktioniert einfach nicht :frowning: hier mal der komplette sub, dan ich dazu habe:

sub read\_SingleProfileData {
 @list = &memberlist; #aufruf, einer dateiliste aller User
 foreach $temp (@list) {
 chomp($temp);
 ($name, $memberfile) = split(/\|/, $temp);
 if ($name eq $\_[0]) { #wenn der name stimmt, die datei (Profiledatei) öffnen
 open(MEMBERPROFILE, "$memberfile.cgi");
 $zeile = $\_[1];
 for ($i=1; $i ;
 }
 $memberinhalt = ;
 close(MEMBERPROFILE);
 }
 } 
return $memberinhalt;
}
#aufruf des sub´s, so:
$eMail = &read\_SingleProfileData("name das users",5);
print "$eMail";

was ich beim Aufruf bekomme ist allerdings immer nur die 1. Zeile des Profiles, sonst nichts. Ob ich da nun schreibe, das ich zeile 5 haben will oder 3 oder 1 ist völlig egal, ich bekomme IMMER nur die 1. Zeile der Datei zurück :frowning: Ideen? :wink: *hoff*

sub read\_SingleProfileData {
 ...
 $zeile = $\_[1];
 for ($i=1; $i ;
 }
 $memberinhalt = ;
 ...
}

Ohne das Problem genau auf den ersten Blick zu sehen, würd ich mir nach deiner Fehlerbeschreibung mal folgende Zeile genauer anschauen

$zeile = $\_[1];

Steht in dem $_[1] auch wirklich die Zeilennummer drin? So wie das klingt, steht da wahrscheinlich gar nix drin (bzw. 0), weswegen das Programm gar nie in die for-schleife reinläuft und auch keine vorherigen Zeilen einmüllt.

Bruno

Hi Martin!

Eine späte Antwort, aber es war nicht ersichtlich, ob Du das Problem schon gelöst hast.

Laut dem „Perl Kochbuch“ (sehr empfehlenswert!), ist die einfachste Lösung folgende:

$. = 0;
do { $LINE = } until $. == $GEWUENSCHTE_ZEILE || eof;

Es werden auch noch ein paar kniffligere Wege vorgestellt, die ich mir hier erspare.

Alles in allem sehe ich aber auch keinen Grund, warum Dein letzter Code nicht funken sollte… hmm…

Ciao,
Frank

hi,

doch doch, funzt ja. Nur halt über den Umweg, erst die komplette Datei einzulesen und dann die gewünschte Zeile aus der Vaiable zu entnehmen.
Ich habe aber mittlerweile das Problem mit einer for Schleife beheben können :wink: Kannst Du weiter unten lesen :smile:
Trotzdem danke

bye,
Martin

jo, mein Fehler :smile: Die Falsche Variable bei der Zeilenzahl verwendet :smiley: Irren ist männlich gelle :wink:
jetzt funzt es :wink: danke

bye,
Martin