2010-01-18 6 views
1

$directory의 내용으로 3 개의 배열을 만들어야합니다. 첫 번째 I을 사용할 수 있습니다Perl에서 디렉토리 내용의 배열을 만들려면 어떻게해야합니까?

$var = qx{ls $directory}; 
print $var; 

를 두 번째 및 세 번째 I는 "보조 *"

내가 사용했던 명령 "주 *"를 위해 grep을하려는 그러나 :

my @primary = 0; 
my @secondary = 0; 

@primary = system("ls test_77 > test | grep Primary* test"); 
print @primary; 
@secondary = system("ls test_77 > test | grep Secondary* test"); 
print @secondary; 

PrimaryCPE_Option_A.txt.test_77 
PrimaryCPE_Option_B.txt.test_77 
0SecondaryCPE_Option_A.txt.test_77 
SecondaryCPE_Option_B.txt.test_77 
0 

가 무엇을 할 수 있습니다 :

는하지만, 그것은 출력에 0을 포함? 처음에는 원래의 0 일 것 같지만 초기 값을 변경할 수 있고 작동하지 않습니다.

+0

피 '시스템'. – aartist

+0

정말 ls의 출력을 grep로 파이핑하고 있습니까? 정말로 세미콜론인가? ls 출력을 파일로 재지 정하고 그 출력을 grep로 파이프하는 것은 이상하게 보입니다. – toolic

답변

3

펄은 시스템 명령을 호출하지 않고이 작업을 수행 할 수 있습니다. ,

@secondary=glob("*Secondary*.txt"); 
print @secondary; 
@primary=glob("*Primary*.txt") 
print @primary; 

다른 방법) (/가 readdir을했던 opendir()를 사용하고, 또는 루프의 예 동안

while(my $file=<*Primary*txt>){ 
    push(@secondary,$file); 
} 

또는

push (@secondary,$_) while<*Secondary*.txt> ; 
+0

영원히 고마워,이 완벽하게 작동합니다. 당신은 모두 훌륭합니다! – Soop

0

opendir (및 readdir 등)을 사용해야한다고 생각합니다.

현재 새 프로세스를 생성하고 함께 파이프하는 반면 Perl은 표준 내장 명령을 사용하여 프로세스에서이 모든 작업을 수행 할 수 있습니다. 결과는 Perl 정규식을 사용하여 추가 처리를위한 배열로 즉시 반환됩니다.

(당신이 당신의 접근 방식을 계속한다면 당신은 당신의 grep*을 탈출해야합니다.)

3

다음은 현재 디렉토리에있는 모든 파일을 읽 한 배열에 저장하십시오. 서브 디렉토리는 제외되지만, . 문자로 시작하는 파일을 포함합니다. 그런 다음 첫 번째 배열에서 2 개의 다른 배열을 만듭니다. File::Slurp을 참조하십시오.

use strict; 
use warnings; 
use File::Slurp qw(read_dir); 

my @all_files = grep { -f $_ } read_dir('./'); 
my @pfiles = grep {/^Primary/ } @all_files; 
my @sfiles = grep {/^Secondary/} @all_files; 

이제 질문에 답변 해 드리겠습니다. system은 외부 명령의 종료 상태를 반환합니다 (예 : ls). 디렉토리 목록을 리턴하지 않습니다. 디렉터리 목록을 반환하려면 qx을 사용합니다. system을 참조하십시오.

따라서 ls 명령이 성공 했으므로 종료 상태는 0입니다. 따라서 system은 0을 반환합니다.이 값은 배열의 첫 번째 요소에 저장됩니다. 그것이 배열의 유일한 값입니다. 내가 본 다른 출력은 grep에서 오는 것입니다.또한

, 당신의 출력을 재현 가까이 올 수있는 유일한 방법은, 그리고 * 치우는하여 system 전화에 세미콜론에 파이프를 변경하는 것입니다 :

@primary = system("ls test_77 > test ; grep Primary test"); 
1

이 내가 이것을 쓰는 것이 방법입니다 프로그램 :

#! /usr/bin/env perl 
use strict; 
use warnings; 
use autodie; # this is so that you don't have to check opendir(), and readdir(). 

my @files = grep { 
    -f $_; 
} do{ 
    opendir my $dir, '.'; 
    readdir $dir; 
}; 

my @primary = grep {/Primary/ } @files; 
my @secondary = grep {/Secondary/} @files; 

당신은이 같은 배열을 선언하여 목록에 0을 가하고 있습니다 :

,
my @primary = 0; 

빈 배열을 원하면 그냥 선언하십시오.

my @primary; 

명시 적으로 아무것도 배열 설정하려면 : 가능하면 펄을 사용하는 동안

@primary =(); 
관련 문제