Lorsque vous appelez le fichier de test opérateurs (-f
, -d
, -s
, etc) Perl fait réellement un appel au système d'exploitation de l' stat
fonction. L' stat
fonction renvoie une structure pleine de toutes sortes d'informations intéressantes sur le fichier en question, mais chaque fichier de test opérateurs ne regarde que l'un des champs de cette structure (c'est un fichier? est-il un répertoire? c'est quoi les dimensions?)
Il est commun que vous pourriez vouloir en savoir plus qu'un morceau de l'information sur un fichier (c'est un fichier? puis-je le lire? puis-je exécuter?) Le naïf façon d'écrire qui est:
if (-f $file and -r $file and -x $file)
Mais cela fait trois appels d' stat
- avec chacun d'eux ne cherche à l'un des champs de la structure. Pour atténuer la situation, Perl est intelligent et met en cache les résultats de l'appel le plus récent à l' stat
. Il est mis en cache à l'encontre de la spéciale filehandle _
. Donc, d'une façon plus efficace d'écrire le même code est:
if (-f $file and -r _ and -x _)
Cela ne fait qu'un appel à l' stat
.
Depuis Perl 5.10, vous pouvez également utiliser "empilées fichier tests" et écrivez ce code:
if (-x -r -f $file) # Note reversed order of operators
Mise à jour: perldoc dit cela à propos de la empilés fichier opérateurs.
Comme de Perl 5.10.0, comme une forme purement syntaxique de sucre, vous pouvez
pile fichier de test opérateurs, de façon à, -f -w -x $file
est
équivalent à"-x $file && -w _ && -f _
. (Ce n'est que fantaisie
syntaxe: si vous utilisez la valeur de retour de l' -f $file
comme argument
à l'autre filetest opérateur, aucune magie qui va se passer.)