Perl opendir()은 하나의 작업만 허용합니까?

Perl opendir()은 하나의 작업만 허용합니까?

opendir()나는 나에게 이해가 되지 않는 Perl 함수에서 이상한 문제를 발견했습니다 .

다음 예에서 Perl은 $path로 지정된 디렉토리를 열고 모든 하위 디렉토리 이름을 추출합니다.

opendir(my $dh, $path) or die "can't opendir $path: $!";
my @dirs = grep { ! /^[\.]{1,2}$/ && -d "$path/$_" } readdir($dh);
closedir($dh);
foreach my $d (@dirs) {
   print $encoder->encode($d);
}

이 예에서 Perl은 $path로 지정된 디렉토리를 열고 모든 파일 이름을 추출합니다.

opendir(my $dh, $path) or die "can't opendir $path: $!";
my @files = grep { ! /^[\.]{1,2}$/ && -f "$path/$_" } readdir($dh);
closedir($dh);
foreach my $f (@files) {
   print $encoder->encode($f);
}

그러나 다음 코드를 찾았습니다.오직인쇄 디렉토리:

opendir(my $dh, $path) or die "can't opendir $path: $!";
my @dirs = grep { ! /^[\.]{1,2}$/ && -d "$path/$_" } readdir($dh);
my @files = grep { ! /^[\.]{1,2}$/ && -f "$path/$_" } readdir($dh);
closedir($dh);

foreach my $f (@files) {
   print $encoder->encode($f);
}
foreach my $d (@dirs) {
   print $encoder->encode($d);
}

grep위의 예에서 두 줄을 교환할 때 Perl이 @files먼저 할당하도록 하면 Perl은오직문서를 인쇄합니다.

뭐하세요? !

다음 코드를 사용하여 파일과 디렉터리를 인쇄하는 해결 방법을 찾았습니다.

opendir(my $dh, $path) or die "can't opendir $path: $!";
my @dirs = grep { ! /^[\.]{1,2}$/ && -d "$path/$_" } readdir($dh);
closedir($dh);

opendir(my $dh, $path) or die "can't opendir $path: $!";
my @files = grep { ! /^[\.]{1,2}$/ && -f "$path/$_" } readdir($dh);
closedir($dh);

foreach my $f (@files) {
   print $encoder->encode($f);
}
foreach my $d (@dirs) {
   print $encoder->encode($d);
}

하지만 스크립트를 작동시킬 수는 있지만 여전히 모르겠습니다.Perl은 여기서도 같은 방식으로 동작합니다. 내 이해에 따르면 opendir()디렉토리를 열고 첫 번째 인수에 핸들을 할당하는 것은 입니다 closedir(). 그렇다면 $dh핸들이 닫히지 않으면 왜 여러 작업을 수행할 수 없습니까?

추가 정보:

$ perl --version
This is perl 5, version 26, subversion 1 (v5.26.1) built for x86_64-linux-gnu-thread-multi

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic

Windows의 Linux 하위 시스템에서 이 코드를 실행하고 있습니다.

답변1

나는 사용할 것이다rewinddir스캔 사이.

Perl의 디렉토리 검색 기능(Perl의 다른 많은 기능과 마찬가지로)은 C 런타임 위에 있는 얇은 계층입니다. 열리는디렉터리 스트리밍을 사용하면 다음을 수행할 수 있습니다.항목 읽기디렉토리에서 한 번에 하나 이상. 하지만 일단 읽어보면 다음과 같다.완벽한. 목차를 다시 읽고 싶다면 rewinddir그렇게 할 수 있습니다.

비교를 위해 POSIX (C)에 대한 링크가 있습니다.opendir,readdir그리고rewinddir.

관련 정보