2010-02-15 3 views
5

, 당신이 패턴과 일치하는 파일의 목록을 얻을 수 있습니다 : (이 함수에 전달 있기 때문에) 이제Perl에서 변수의 값을 glob 패턴으로 사용하려면 어떻게해야합니까? 펄에서

my @list = <*.txt>; 
print "@list"; 

을, 나는 변수로 패턴을 통과하고 싶습니다. 하지만 작동하지 않습니다 :

sub ProcessFiles { 
    my ($pattern) = @_; 
    my @list = <$pattern>; 
    print "@list"; 
} 

readline() on unopened filehandle at ... 

어떤 제안이 있습니까?

답변

12

사용 glob : 여기

use strict; 
use warnings; 

ProcessFiles('*.txt'); 

sub ProcessFiles { 
    my ($pattern) = @_; 
    my @list = glob $pattern; 
    print "@list"; 
} 

당신이 경고 I/O Operators에서 얻을 이유에 대한 설명입니다

무엇을 꺾쇠 괄호 포함하는 경우 간단한 스칼라 변수 (예 : $ foo), 그 변수는 을 입력 할 파일 핸들의 이름 인 을 포함합니다. . 그것은 아마 처음부터 그것을 짓을 할 수있는 올바른 방법 인 글로브 ($ foo는)으로 직접 내부 함수를 호출 청소기 간주.), 지금, 지금, 지금이 작업을 수행하지

-1

"eval"명령으로 래핑하는 것은 어떻습니까? 이렇게 ...

sub ProcessFiles { 
    my ($pattern) = @_; 
    my @list; 
    eval "\@list = <$pattern>"; 
    print @list; 
} 
+1

마십시오 . 'glob' 연산자가 정답입니다. – friedo

+0

맞습니다. 글로브가 훨씬 더 좋은 대답입니다. 수정 해줘서 고마워. 왜 "절대로, 언제나, 언제 까지나"이것을해라. –

+1

Robert, 가능한 경우 문자열'eval'을 피하십시오. 무엇이 사악한 데이터가'$ pattern'에서 끝날지 알고 있습니다. 특히 그것이 사용자 입력에서 파생 된 것이라면 말이죠. 악의적이지 않더라도, "평가판"에 들어가는 이상한 것들이 많은 고통스러운 버그의 원인이 될 수 있습니다. – friedo

0

왜 파일 목록의 배열 참조를 함수에 전달하지 않습니까?

my @list = <*.txt>; 
ProcessFiles(\@list); 

sub ProcessFiles { 
    my $list_ref = shift; 
    for my $file (@{$list_ref}) { 
     print "$file\n"; 
    } 
} 
+1

나는 누군가가 이것을 제안 할 것을 알았다. 문제는 실제로 다음과 같이 시작하는 변수라는 것입니다 :'my $ pattern = "test- % d - *. txt"; ProcessFiles (sprintf ($ pattern, "51"));' – Frank

0
use File::Basename; 
@ext=(".jpg",".png",".others"); 
while(<*>){ 
my(undef, undef, $ftype) = fileparse($_, qr/\.[^.]*/); 
if (grep {$_ eq $ftype} @ext) { 
    print "Element '$ftype' found! : $_\n" ; 
} 
}