Pregunta

Ver también: ¿En qué parte de la documentación dice que mientras prueba ReadDir para definir la definición?. (No es un duplicado; Simplemente estrechamente relacionado.)


Muchas personas tratan el ciclo a continuación como idiomático:

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

en vez de:

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

Porque supuestamente con la última versión si el nombre de archivo es solo "0" (cero) debería terminar el bucle, mientras que devuelve 'undef' cuando no hay más archivos.

Sin embargo, en algún momento en el pasado esta prueba para defined() Dejó de ser necesario: parece haber un código de caso especial que permite que la última versión funcione independientemente.

¿Me gustaría saber cómo funciona esto?

Curiosamente, si reemplazo la llamada a readdir() con una llamada a foo() en cambio:

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

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

Entonces el código lo hace Haz lo que esperaría y termina el bucle cuando se encuentra un archivo llamado "0".

(Probado con Perl 5.8.9 en MacOS x 10.5.6)

¿Fue útil?

Solución

Es mágico. Específicamente mientras Magic (documentado en perlsyn, perlop, y probablemente otros lugares que no recuerdo). Perl te permite ciertas anotaciones de taquigrafía. Si quieres ver qué está haciendo Perl a sus espaldas, puedes usar B::Deparse. Aquí hay un archivo que usa el bucle de taquigrafía:

#!/usr/bin/perl

use strict;
use warnings;

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

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

Si tu corres perl -MO=Deparse filename.pl obtienes el código que perl ve:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top