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 하위 시스템에서 이 코드를 실행하고 있습니다.