Thread aktuelles Verzeichnis (43 answers)
Opened by J-jayz-Z at 2005-05-15 02:55

Dubu
 2005-05-19 11:31
#54929 #54929
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=J-jayz-Z,18.05.2005, 16:19]Das passiert bei mir nur, wenn ich in /home/rootcris/ bin und das script mit scripts/filesize.pl aufrufe...[/quote]
Okay, auch dieser Code listet bei mir das aktuelle Verzeichnis und nicht das, in dem das Skript ist ... sei's drum.

Ein Anmerkung habe ich aber noch: Du benutzt zu viele Anfuehrungszeichen: Statt opendir(DIR, "$f") heisst es einfach opendir(DIR, $f) und statt if (-d "$opts{d}") schreibt man besser if (-d $opts{d}).

Ich nehme mal an, dass du vor Perl einige Shellprogrammierung gemacht hast. Das gleiche Problem hatte ich naemlich auch am Anfang.
Die Ursache: In der Shell muss man immer aufpassen, weil Variablen expandiert werden, bevor die Befehlszeile ausgefuehrt wird. Ein Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
$ dirname="foo bar"
$ cd $dirname
$ pwd
/foo
$ cd /
$ cd "$dirname"
$ pwd
/foo bar

Man sieht: Wenn ich cd $dirname ohne Anfuehrungszeichen schreibe, dann expandiert das zu cd foo bar, bevor das cd ausgefuehrt wird, und ich lande im falshcne Verzeichnis. Hier brauche ich Anfuehrungszeichen.

Perl dagegen ist hier eine "richtige" Programmiersprache und evaluiert die Syntax eines Terms, bevor die Variablen expandiert werden (ausser, natuerlich, in einem String-eval :)).

Die zusaetzlichen Anfuehrungszeichen kann man also in Perl getrost weglassen. Im Gegenteil, in Perl kann man damit eher Schaden anrichten, wenn man eine Interpolation als String erzwingt. Hier ein Beispiel:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
use strict;
use warnings;

sub printref {
   print ${$_[0]};
}

my $foo = "abc";
my $fooref = \$foo;       # Referenz auf $foo

printref($fooref);        # liefert "abc"
printref("$fooref");      # liefert Warnung "Can't use string ("SCALAR(0x12345678)")
                          # as a SCALAR ref while "strict refs" in use at ..."


Auch bei Zahlen sind ueberfluessige Anfuehrungszeichen kontraproduktiv, weil Perl jedes Mal gezwungen wird, eine Stringdarstellung der Zahl zu erzeugen, diese zu verwenden und bei einer Rechnung wieder in eine Zahl zurueck zu wandeln. Dies kann meiner Ansicht nach auch zu Verlusten in der Rechengenauigkeit fuehren.

View full thread aktuelles Verzeichnis