Vedere anche: Where in the documentation does it say that while tests readdir for definedness?. (Non un duplicato; solo strettamente legata.)Com'è risultato "0" da readdir() non falso in una condizione while?
Molte persone trattano il ciclo di seguito come idiomatica:
while (defined(my $file = readdir($dir)) {
...
}
invece di:
while (my $file = readdir($dir)) {
...
}
perché si suppone con quest'ultimo versione se il nome del file è solo "0" (zero) dovrebbe terminare il ciclo, mentre restituisce 'undef' quando non ci sono più file.
Tuttavia, a un certo punto nel passato questo test per defined()
ha smesso di essere necessario - sembra esserci un codice di caso speciale che consente a quest'ultima versione di funzionare indipendentemente.
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 fare ciò che mi aspettavo, e terminare il ciclo quando un file chiamato "0 " è stato trovato.
(testato con Perl 5.8.9 su MacOS X 10.5.6)
+1 per B :: Deparse - sarebbe veramente utile se qualcuno in grado di fornire collegamenti a documentazione specifica. Non riesco a trovarlo nell'uomo perlsyn. – Alnitak
Fare clic su B :: Deparse per i documenti su di esso, fare clic su perlsyn per accedere alla sezione di perlsyn che documenta il comportamento (cercare "che è Perl short-hand per la versione scritta più esplicitamente:"). Ci sono documenti migliori da qualche parte, ma non riesco a ricordare dove. –
Aggiunto un collegamento alla sezione perlop che copre anche questo, ma ancora nessun documento specifico sul perché readdir ottiene lo stesso trattamento. –