Perl에서 디렉토리 목록을 어떻게 얻습니까? [복제하다
문제
이 질문은 이미 여기에 답이 있습니다.
실행하고 싶습니다 ls
CGI 스크립트의 일부로 PERL 프로그램에서. 이것을 위해 나는 사용했습니다 exec(ls)
, 그러나 이것은로부터 돌아 오지 않습니다 exec
전화.
Perl에서 디렉토리 목록을 얻는 더 좋은 방법이 있습니까?
해결책
exec는 전혀 돌아 오지 않습니다. 원한다면 시스템을 사용하십시오.
디렉토리를 읽으려면 Open/Read/Close-Dir이 더 적절할 수 있습니다.
opendir my($dh), $dirname or die "Couldn't open dir '$dirname': $!";
my @files = readdir $dh;
closedir $dh;
#print files...
다른 팁
다른 모든 사람들은 질문의 실행 부분에 붙어있는 것 같습니다.
디렉토리 목록을 원한다면 Perl의 내장을 사용하십시오. glob
또는 opendir
. 별도의 프로세스가 필요하지 않습니다.
exec PERL 프로그램에 대한 제어를 제공하지 않습니다.체계 LS의 결과를 반환하지는 않지만 상태 코드를 반환합니다. 진드기 자국 `` 우리의 명령의 출력을 제공하지만 일부는 안전하지 않은 것으로 간주됩니다.
내장 된 DIR 함수를 사용하십시오. Opendir, Readdir 등.
시스템 명령의 출력을 얻으려면 백틱을 사용해야합니다.
$listing = `ls`;
그러나 Perl은 디렉토리 자체를 다루는 데 좋습니다. 파일 :: 찾기 :: 규칙을 사용하는 것이 좋습니다.
Perl Globbing 사용 :
my $dir = </dir/path/*>
또 다른 예 :
chdir $dir or die "Cannot chroot to $dir: $!\n";
my @files = glob("*.txt");
편집 : whoops! 디렉토리 목록을 원한다고 생각했는데 ...이 스크립트가 원하는대로 수행하기 위해 '디렉토리'호출을 제거합니다 ...
파일 핸들을 가지고 노는 것은 내 의견으로는 잘못된 방법입니다. 다음은 Pile :: Find :: Rule을 사용하는 예입니다. 지정된 디렉토리에서 모든 디렉토리를 찾으십시오. 그것은 당신이하고있는 일에 대해 과장된 것처럼 보일지 모르지만 나중에 줄을 내려 놓을 가치가 있습니다.
먼저, 한 줄의 솔루션 :
File::Find::Rule->maxdepth(1)->directory->in($base_dir);
이제 주석이있는 더 많은 버전입니다. 파일 :: find :: 규칙이 설치된 경우이 문제없이 실행할 수 있어야합니다. CPAN을 두려워하지 마십시오.
#!/usr/bin/perl
use strict;
use warnings;
# See http://search.cpan.org/~rclamp/File-Find-Rule-0.32/README
use File::Find::Rule;
# If a base directory was not past to the script, assume current working director
my $base_dir = shift // '.';
my $find_rule = File::Find::Rule->new;
# Do not descend past the first level
$find_rule->maxdepth(1);
# Only return directories
$find_rule->directory;
# Apply the rule and retrieve the subdirectories
my @sub_dirs = $find_rule->in($base_dir);
# Print out the name of each directory on its own line
print join("\n", @sub_dirs);
나는 당신이 보는 것이 좋습니다 IPC :: Open3. 시스템이나 백틱보다 스폰 된 프로세스를 훨씬 더 많이 제어 할 수 있습니다.
Linux에서는 다음을 선호합니다.
my @files = map { chomp; $_ } `find`;