문제

이 질문은 이미 여기에 답이 있습니다.

실행하고 싶습니다 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 등.

http://perldoc.perl.org/functions/opendir.html

http://perldoc.perl.org/functions/readdir.html

시스템 명령의 출력을 얻으려면 백틱을 사용해야합니다.

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