Schrift
[thread]8248[/thread]

Erste Zeile überspringen: beim Auslesen einer Datei

Leser: 1


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
bloonix
 2006-08-19 22:46
#69002 #69002
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Leute,

wie überspringt man am besten die erste Zeile beim Auslesen eines
Filehandles? Ich weiß, dass die erste Zeile immer der Header ist und den
ich nicht verarbeiten möchte.

Ich hatte mir zunächst folgendes gedacht:

Code: (dl )
1
2
3
4
5
open my $fh, '<', $file or die $!;
<$fh>; # erste Zeile "überspringen"
while (my $line = <$fh>) {
# Verarbeitung
}


Aber dann wird $_ geschrieben. Wie macht man das am Saubersten?
In einer Shell würde ich nach /dev/null umleiten, aber geht sowas auch
in Perl?

Gruss,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
ich
 2006-08-19 22:52
#69003 #69003
User since
2003-09-19
120 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo opi,

wenn die Datei nicht alzu gross ist koenntest du ja die Datei erst in einen Array einlesen.

Code: (dl )
1
2
3
4
5
open( FH,  "<$file" ) or die( $! );
my @lines = <FH>;
close( FH );

shift( @lines );


Gruss
Jan
If you tell the truth you don't have to remember anything.
-- Mark Twain
bloonix
 2006-08-19 23:02
#69004 #69004
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=ich,19.08.2006, 20:52]
Code: (dl )
my @lines = <FH>;
[/quote]
hmm... absolut ungern! Dateien in einem Array ablegen halte ich
grundsätzlich für schlecht. Dann einige ich mich selber wohl eher auf

Code: (dl )
{my $null = <$fh>;}
:
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
sid burn
 2006-08-19 23:07
#69005 #69005
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
@opi

Nö, also bei mir wird nicht $_ beschrieben durch einen normalen aufruf von "<$fh>".

Die eigenheit das $_ durch einen normalen Aufruf eines Dateihandles geschrieben wird, existiert nur innerhalb einer while() Schleife. Ansonsten nirgendswo.

Wenn du einen kleinen test schreibst wirst du auch sehen das dies so ist.

Code: (dl )
1
2
3
4
5
6
7
$_ = "blub";
open my $fh, '<', 'text';
<$fh>;
print $_;
while ( my $line = <$fh> ) {
print $line;
}

Es wird dann immer noch "blub" ausgegeben, und von der Datei dann die erste Zeile übersprungen.\n\n

<!--EDIT|sid burn|1156015285-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
bloonix
 2006-08-19 23:12
#69006 #69006
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hi sid,


stimmt! Aber was passiert denn dann mit der ersten Zeile?
Wohin "wandert" sie?

Gruss,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
sid burn
 2006-08-19 23:17
#69007 #69007
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=opi,19.Aug..2006, 21:12]stimmt! Aber was passiert denn dann mit der ersten Zeile?
Wohin "wandert" sie?[/quote]
Nirgendswo,
die ist dann weg. ;)

Das ist fast das selbe wie ein void Kontext. Sprich wenn du einfach "$line;" schreibst, dann passiert damit auch nichts. Nur gibt es hier den nebeneffekt das dein Handle eine Zeile weiter springt.

Eigentlich fast das selbe wie "unshift @lines;". Den da holst du ja auch eine Zeile heraus, speicherst die Zeile aber nirgendswo, sprich Sie wird verworfen. Verwendung war dann auch eher der Nebeneffekt einfach das erste Element des Arrays zu entfernen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Ronnie
 2006-08-20 00:16
#69008 #69008
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
while (<>) {
next if $. == 1;
# yada yada yada
}
AndreasM
 2006-08-20 00:25
#69009 #69009
User since
2005-10-08
31 Artikel
BenutzerIn
[Homepage] [default_avatar]
Die Spezialvariable $. gibt die aktuelle Zeilennummer des Dateihandles an.
Und eine Schleife lässt sich mit next,last und redo steuern.
Last verlässt die Schleife, next "spult vor", und redo wiederholt.

Quote
open my $fh, '<', $file or die $!;
while (my $line = <$fh>) {
  next if $. ==1;
  # Verarbeitung
}


Grüße
AndreasM\n\n

<!--EDIT|AndreasM|1156019243-->
Strat
 2006-08-20 14:30
#69010 #69010
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
achtung: $. funktioniert nicht bei
Code: (dl )
foreach my $line (<$fh>) {

weil da die gesammte datei auf einmal in ein unbenanntes Array eingelesen wird.

Bei den verwendeten while-construkten funktioniert's jedoch.

ich wuerde es folgendermaszen machen
Code: (dl )
1
2
3
{ my $ignoreFirstLine = <$fh>; }
while( defined (my $line = <$fh>) ) {
...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
sid burn
 2006-08-20 17:45
#69011 #69011
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
@Strat
Welchen Vorteil hat es denn, wenn du die Zeile in einem Skalar speicherst, und das Skalar direkt darauf wieder vernichtet wird, anstatt einfach nur "<$fh>" zu schreiben?

Auch die Möglichkeit mit der Überprüfung von $. in der while Schleife finde ich nicht so prickelnd. Für mich schaut es irgendwie nach Performanceverschwendung aus, ständig $. in jedem Schleifendurchlauf zu Testen, obwohl man es nur einmal am Anfang braucht.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-08-19 22:46.