Question

Voir également: Où dans la documentation dit-elle que lors des tests Readdir pour la définition?. (Pas un double; Juste étroitement lié.)


Beaucoup de gens traitent la boucle ci-dessous comme idiomatique:

while (defined(my $file = readdir($dir)) {
    ...
}

à la place de:

while (my $file = readdir($dir)) {
    ...
}

Parce que soi-disant avec cette dernière version si le nom de fichier est juste "0" (zéro), il doit mettre fin à la boucle, tandis qu'il renvoie "undef" lorsqu'il n'y a plus de fichiers.

Cependant, à un moment donné dans le passé ce test pour defined() Arrêté d'être nécessaire - il semble y avoir du code de cas spécial qui permet à cette dernière version de fonctionner malgré tout.

J'aimerais savoir comment cela fonctionne?

Curieusement, si je remplace l'appel à readdir() avec un appel à foo() Au lieu:

sub foo
{
    my ($dir) = @_;
    return readdir($dir);
}

while (my $file = foo($dir)) {
    ...
}

puis le code Est-ce que Faites ce à quoi je m'attendais et terminez la boucle lorsqu'un fichier nommé "0" est trouvé.

(Testé avec Perl 5.8.9 sur MacOS X 10.5.6)

Était-ce utile?

La solution

C'est magique. Spécifiquement pendant la magie (documentée dans perlsyn, perlop, et probablement d'autres endroits dont je ne me souviens pas). Perl vous permet de faire des notations de raccourci. Si vous voulez voir ce que Perl fait derrière votre dos, vous pouvez utiliser B::Deparse. Voici un fichier qui utilise la boucle de raccourci:

#!/usr/bin/perl

use strict;
use warnings;

opendir my $dir, "/tmp" or die "$!";

while (my $file = readdir($dir)) {
    print "$file\n";
}

Si vous courez perl -MO=Deparse filename.pl Vous obtenez le code que Perl voit:

use warnings;
use strict 'refs';
die "$!" unless opendir my $dir, '/tmp';
while (defined(my $file = readdir $dir)) {
    do {
        print "$file\n"
    };
}
filename.pl syntax OK
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top