Thread Netzwerkverzeichnis mit opendir (16 answers)
Opened by Gast at 2006-01-20 02:48

Strat
 2006-01-25 15:18
#62097 #62097
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
1. warum nicht zuerst mal bei
Code: (dl )
my $fd = $smb->opendir("smb://bioboss/shared/Hubert/Blast");

fehler abfangen? ist da 100% sicher, dass da nie was passieren kann?

2. my-variablen immer so knapp wie moeglich definieren, also z.B. nicht
Code: (dl )
1
2
my $file;
foreach $file (@thefiles) {

sondern
Code: (dl )
foreach my $file (@thefiles) {

dann ist $file nur im block der foreachschleife gueltig, und nicht auch vorher und nachher. der Wert von $file ist nach der schleife genau derselbe wie vor der schleife, weil for(each) da einen alias auf das listenelement bildet; wenn man wirklich nach der schleife $file braucht, dann kann man es ja auch dann definieren/deklarieren, z.B.
Code: (dl )
1
2
3
4
foreach my $file (@thefiles) {
# ...
} # foreach
my $file = "irgendwas";


3. genauso bei @rawdata: wenn du es ausserhalb der aeusseren schleife nicht verwendest, dann muss es da auch nicht deklariert sein.

4.
Code: (dl )
open (bigShot, ">>hello_Jesus.txt") || die ("Could not open file. $!");

Es wird empfohlen, Filehandles immer mit grossbuchstaben zu schreiben.
Ich empfehle folgendes konstrukt:
Code: (dl )
1
2
3
4
my $fileJesus = "hello_Jesus.txt";
open (my $JESUS, ">>", $fileJesus) or die "Error: couldn't open file '$fileJesus': $!\n";
print $JESUS "irgendwas\n";
close ($JESUS);

durch den lexikalischen Fielehandle ist dieser nur innerhalb dieses blockes gueltig, und du musst dich (kaum) darum kuemmern, was fuer filehandlenamen ausserhalb alle verwendet werden.
Code: (dl )
1
2
3
4
5
6
open (FH, "<", $file1) or die;
while (my $line = <FH>) {
chomp($line);
open (FH, "<", $line) or die;
my $firstLine = <FH>;
}

hier liest dann die while-schleife die erste zeile aus $file1 und dann ab der zweiten zeile von $file2... und wenn sowas ueber mehrere subroutinen hinweg verstreut ist, wird sowas manchmal sehr schwer zu finden

5. die zeilen
Code: (dl )
1
2
@raw_data = <DAT>;
foreach my $wrestler (@raw_data)

kann man auch zusamenfassen, wenn du @raw_data nur fuer die schleife verwendest
Code: (dl )
foreach my $wrestler (<DAT>) {

das wuerde die komplette datei auf einmal in den RAM lesen und danach ueber die einzelnen zeilen laufen (weil <DAT> im listenkontext verwendet wird, was die komplette datei einliest).
wenn du immer nur eine zeile brauchst und nicht mehrere gleichzeitig, ist der folgende weg sparsamer:
Code: (dl )
1
2
3
while (my $wrestler = <$DAT>) {
print "blabla: $wrestler";
}

weil <..> im skalaren kontext immer nur die naechste zeile einliest, und somit immer nur eine zeile im RAM ist (gerade bei groesseren Dateien ist das ein muss)

6.
Code: (dl )
print bigShot ($wrestler);

kann eventuell mal probleme bereiten, wenn es eine funktion namens bigShot gibt (nicht allerdings mit lexikalischen Filehandles)
deshalb besser entweder:
Code: (dl )
print (BIGSHOT "blabla\n");

oder
Code: (dl )
print BIGSHOT "blabla\n";

oder noch besser:
Code: (dl )
print $BIGSHOT "blabla\n";
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/

View full thread Netzwerkverzeichnis mit opendir