문제

또한보십시오: 문서에서 정의 된 것에 대해 READDIR을 테스트하는 동안 어디에 있습니까?. (복제본이 아닙니다. 밀접하게 관련되어 있습니다.)


많은 사람들이 아래의 루프를 관용적으로 취급합니다.

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

대신에:

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

파일 이름이 "0"(0) 인 경우 후자 버전을 사용하기 때문에 루프가 끝나는 반면 더 이상 파일이 없을 때 'undef'를 반환해야합니다.

그러나 과거의 어느 시점 에서이 테스트는 defined() 필요하지 않은 경우 - 후자 버전이 작동 할 수있는 특수 사례 코드가있는 것으로 보입니다.

이것이 어떻게 작동하는지 알고 싶습니까?

흥미롭게도 전화를 교체하면 readdir() 전화로 foo() 대신에:

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

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

그런 다음 코드 하다 내가 기대하는 것을하고 "0"이라는 파일이 발견 될 때 루프를 종료하십시오.

(MacOS x 10.5.6에서 Perl 5.8.9로 테스트)

도움이 되었습니까?

해결책

그것은 마법입니다. 구체적으로 마법 (문서화) perlsyn, perlop, 아마도 내가 기억하지 못하는 다른 곳). Perl은 특정 속기 표기법을 허용합니다. Perl이 등 뒤에서 무엇을하고 있는지보고 싶다면 사용할 수 있습니다. B::Deparse. 다음은 속기 루프를 사용하는 파일입니다.

#!/usr/bin/perl

use strict;
use warnings;

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

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

당신이 달리면 perl -MO=Deparse filename.pl Code Perl이 표시됩니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top