Perl Mongers :: deutschsprachig - German.pm

A wiki for German-speaking Perl programming language user groups.

Änderungen, Hilfe

Treffen, Veranstaltungen

Leute, Gruppen, Ziele

PerlLernen

Best of Perl Books
Die Besten Bücher

ErfolgsStories

Links, FAQ, Forum

Mailing List

Impressum


Liebe(r) Perl Monger(in),

diese Site ist bereits seit langem ein Ziel von Spamrobotern. Neu ist, dass ich das Aufräumen leid bin. Darum schreibe mir eine Mail mit Deinem Usernamen und einem Crypt Passwort, damit Du einen passwortgeschtzten Zugang zu dieser Site von mir erhältst. Eines baldigen Tages wirst Du den brauchen, um hier weiterhin Seiten verändern zu können.

Vielen Dank, Sören


Amazon-Angebote... (Einkauf über diesen Link sponsort den Unterhalt von perlmongers.de)
-X FILEHANDLE
-X EXPR
-X

Ein Datei-Test, in dem X einer der unten aufgeführten Buchstaben ist. Dieser unäre Operator nimmt einen Parameter an, entweder einen Dateinameb oder ein Filehandle, und testet die damit verbundenen Datei um festzustellen, ob dabei etwas wahr ist. Wird der Parameter weggelassen, wird $_ getestet, außer bei -t, das STDIN testet. Soweit nicht anders dokumentiert, gibt es 1 für wahr und '' für falsch zurück, oder den undefinierten Wert, wenn die Datei nicht existiert. Trotz der komischen Namen, ist die Präzedenz die gleiche wie bei jedem anderen unären Operator und der Parameter kann wie bei jedem anderen unären Operator in Klamern stehen. Der Operator kann einer der folgenden sein: -r-w-x-o-R-W-X-O-e-z-s-f-d-l-p -S-b-c-t-u-g-k-T-B-M-A-C

-r  Datei ist lesbar von der effektiven uid/gid.
-w  Datei ist beschreibbar von der effektiven uid/gid.
-x  Datei ist ausführbar von der effektiven uid/gid.
-o  Datei ist im Besitz der effektiven uid.
-R  Datei ist lesbar von der realen uid/gid.
-W  Datei ist beschreibbar von der realen uid/gid.
-X  Datei ist ausführbar von der realen uid/gid.
-O  Datei ist im Besitz der realen uid.
-e  Datei existiert.
-z  Datei hat die Größe null (ist leer).
-s  Datei hat eine Größe ungleich null (gibt Größe in Bytes zurück).
-f  Datei ist eine einfache Datei.
-d  Datei ist ein Verzeichnis.
-l  Datei ist ein symbolischer Link.
-p  Datei ist eine Named Pipe (FIFO), oder Filehandle ist eine Pipe.
-S  Datei ist ein Socket.
-b  Datei ist eine spezielle Block-Datei.
-c  Datei ist eine spezielle Character-Datei.
-t  Filehandle ist von einem tty geöffnet.
-u  Datei hat das setuid Bit gesetzt.
-g  Datei hat das setgid Bit gesetzt.
-k  Datei hat das sticky Bit gesetzt.
-T  Datei ist eine ASCII-Text-Datei (heuristisch geraten).
-B  Datei ist eine "Binärdatei" (Gegenteil von -T).
-M  Startzeit des Skripts minus Dateimodifikationszeit in Tagen.
-A  Desgleichen für die Zeit die access time.
-C  Desgleichen für die Inodeänderungszeit (Unix, kann bei anderen Plattformen anders sein)

Beispiel:

while (<>) {
    chomp;
    next unless -f $_;      # ignoriert Sonderfälle
    #...
}

Die Interpretation der Dateirechte-Operatoren -r, -R, -w, -W, -x, und -X basiert im Normalfall nur auf den Rechten der Datei und der uids und gids des Users. Es kann noch andere Rechte geben, warum man die Datei dennoch noch nicht lesen, schreiben oder ausführen kann. Solche Gründe können Zugriffsberechtigungen des Dateisystems, ACLs (access control lists), read-only Dateisysteme und unerkannte Formate ausführbarer Dateien sein.

Beachten Sie auch, daß dir Tests -r, -R, -w, und -W für den Superuser auf dem lokalen Dateisystem immer 1 zurückliefern, wenn irgendein execute Bit gesetzt ist. Skripte, die vom Superuser ausgeführt werden, müßten daher stat() verwenden um den tatsächlien Modus der Datei herauszufinden, oder vorübergehend die effektive uid auf etwas anderes setzen.

Wenn Sie ACLs verwenden, gibt es ein Pragma namens filetest, das genauere Ergebnisse erzielen kann, als die blanken stat()-Modus-Bits. Wird use filetest 'access' verwendet, testen die zuvorgenannten filetests ob die Rechte (nicht) gewährt werden können, wobei die access()-Family der Systemaufrufe verwendet wird. Beachten Sie auch, daß -x und -X unter diesem Pragma auch dann wahr zurückgeben, wenn keine Bits für Ausführbarkeitsrechte (noch irgendwelche zusätzliche ausführbarkeitsberechtigenden ACLs) gesetzt sind. Diese Merkwürdigkeit folgt aus den Definitionen der darunterliegenden Systemaufrufen. Lesen Sie die Dokumentation des filetest Pragmas für weitere Informationen.

Beachten Sie, daß -s/a/b/ keine negierte Substitution bewirkt. -exp($foo) hingegen tut das erwartete, allerdings werden nur einzelne Buchstaben, die auf ein Minuszeichen folgen als Datei Tests verstanden.

Die Schalter -T und -B funktionieren so: Ungefähr der erste Block einer Datei wird auf auffällige Zeichen, wie merkwürdige Controlzeichen oder Zeichen mit dem High Bit untersucht. Wenn zu viele dieser auffälligen Zeichen (>30%) gefunden werden, ist es eine -B-Datei, ansonsten eine -T-Datei. Weiterhin wird jede Datei, die eine Null im ersten Block enthält eine Binärdatei. Wenn -T oder -B auf ein Filehandle angewendet werden, wird der aktuelle IO-Puffer anstelle des ersten Blocks untersucht. Sowohl -T als auch -B geben wahr zurück, wenn die Datei leer ist, oder die Datei bei einem Test auf ein Filehandle am EOF ist. Weil es für einen -T-Test nötig ist, eine Datei zu lesen, wird man vielleicht zuerst einen -f-Test auf die Datei ausführen, zum Beispiel so: next unless -f $file && -T $file.

Wenn irgendeinem der Datei-Tests (oder auch den stat oder lstat Operatoren) das besondere Filehandle übergeben wird, das aus einem einzelnen Unterstrich besteht, wird die Structur des vorhergehenden Datei-Tests (oder stat Operators) verwendet um einen Systemaufruf zu sparren. (Das funktioniert nicht mit -t, außerdem sollten Sie daran denken, daß lstat() und -l die Werte in der stat-Struktur für den symbolischen Link belassen, nicht in der tatsächlichen Daten.) (Außerdem, wenn der stat-Puffer von einem lstat-Aufruf gefüllt wurde, überschreiben -T und -B ihn mit den Ergebnissen von stat _). Beispiel:

print "Geht.\n" if -r $a || -w _ || -x _;
 
stat($filename);
print "Lesbar\n" if -r _;
print "Beschreibbar\n" if -w _;
print "Ausführbar\n" if -x _;
print "Setuid\n" if -u _;
print "Setgid\n" if -g _;
print "Sticky\n" if -k _;
print "Text\n" if -T _;
print "Binär\n" if -B _;
Username: