2013-07-22 2 views
6

내 요구 사항은 perl을 사용하여 파일 이름에 'xyz' 텍스트가 들어있는 파일을 인쇄하는 것입니다. 여기에 $ /를 xyz.xlsx - 여기 m에서/* < - 내가 아래 시도하고 다음과 같은 오류가 발생했습니다수량 한정자에서 아무런 변화가 없습니다

수량 어는 <으로 표시 정규식에서 아무것도 다음 없습니다 내가 GREP 정규 표현식에 *를 추가 할 때

use strict; 
use warnings; 

my @files = qw(file_xyz.xlsx,file.xlsx); 
my @my_files = grep { /*xyz.xlsx$/ } @files; 
for my $file (@my_files) { 
    print "The output $file \n"; 
} 

문제오고있다. 어떻게이 작업을 수행 할 수 있습니까?

답변

6

*은 한정 기호라고하는 메타 문자입니다. "이전 문자 또는 문자 클래스를 0 번 이상 반복하십시오"를 의미합니다. 귀하의 경우에는 아무 것도 따르지 않으므로 구문 오류가 발생합니다. 당신이 시도하는 것은 .* : 와일드 카드와 일치하는 것을 매치하는 것입니다. 그러나 이것은 고정되어 있지 않으면 이미 정규 표현식 일치의 기본 동작입니다.

my @my_files = grep { /xyz/ } @files; 

당신은 문자열 앵커 xlsx$의 최종를 유지할 수 있지만 거의 필요 보인다 파일 이름의 제한된 목록을 갖고 있기 때문에 : 그래서 당신이 필요로하는 모든입니다. 당신이 qw() 잘못 사용하고 있지만,이 쉼표로 구분하지 않습니다, 공간이 분리되어

my @files = qw(file_xyz.xlsx file.xlsx); 

그러나, 당신은 파일 이름의 큰 세트를 갖게 할 필요가있는 경우는, 같은 디렉토리에서 하나 개의 읽기, 당신은을 배치 할 수 있습니다 중간에 와일드 카드 문자열 다음 /i 수정의 사용이 소문자를 구별하는 경우에 맞게

my @my_files = grep { /xyz.*\.xlsx$/i } @files; 

참고. .은 다른 메타 문자이기 때문에 반드시 이스케이프해야합니다.

+0

예. 모든 문자와 일치하도록 '*'를 추가했으며 'xyz'가 있고 '.xlsx'로 끝나야합니다. 그렇다면 어떻게해야합니까? – Mari

+0

그래 맞습니다. qw()에 쉼표를 추가하여 실수를했습니다. 대답 해 주셔서 감사합니다. – Mari

+0

@ 마리. 천만에요. 보통 Perl은'qw()'를 잘못 사용하면 경고 메시지를 보냅니다. – TLP

관련 문제