Domanda

Guarda anche: Dove dice nella documentazione, mentre i test readdir per la definizione?. (Non un duplicato; appena strettamente correlato.)


Molte persone trattano il loop di seguito come idiomatico:

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

invece di:

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

Perché presumibilmente con quest'ultima versione se il nome file è solo "0" (zero) dovrebbe terminare il ciclo, mentre restituisce "undef" quando non ci sono più file.

Tuttavia ad un certo punto in passato questo test per defined() Smesso di essere necessario: sembra esserci un codice di caso speciale che consente a quest'ultima versione di funzionare a prescindere.

Mi piacerebbe sapere come funziona?

Curiosamente, se sostituisco la chiamata a readdir() con una chiamata a foo() invece:

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

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

Quindi il codice fa Fai quello che mi aspetterei e termini il ciclo quando viene trovato un file chiamato "0".

(testato con Perl 5.8.9 su MacOS x 10.5.6)

È stato utile?

Soluzione

È magico. In particolare mentre magia (documentata in perlsyn, perlop, e probabilmente altri posti che non ricordo). Perl ti consente alcune notazioni stensa. Se vuoi vedere cosa sta facendo perl dietro la schiena puoi usare B::Deparse. Ecco un file che utilizza il loop stenano:

#!/usr/bin/perl

use strict;
use warnings;

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

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

Se corri perl -MO=Deparse filename.pl Ottieni il codice perl vede:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top