1. warum nicht zuerst mal bei
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
my $file;
foreach $file (@thefiles) {
sondern
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.
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.
open (bigShot, ">>hello_Jesus.txt") || die ("Could not open file. $!");
Es wird empfohlen, Filehandles immer mit grossbuchstaben zu schreiben.
Ich empfehle folgendes konstrukt:
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.
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
@raw_data = <DAT>;
foreach my $wrestler (@raw_data)
kann man auch zusamenfassen, wenn du @raw_data nur fuer die schleife verwendest
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:
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.
print bigShot ($wrestler);
kann eventuell mal probleme bereiten, wenn es eine funktion namens bigShot gibt (nicht allerdings mit lexikalischen Filehandles)
deshalb besser entweder:
print (BIGSHOT "blabla\n");
oder
print BIGSHOT "blabla\n";
oder noch besser:
print $BIGSHOT "blabla\n";