2016-08-25 4 views
0

다음과 같이 perl 코드가 있습니다. 패턴과 일치하는 파일을 선택하려고 시도합니다.파일 배열의 패턴과 일치하는 파일 찾기

opendir ERR_STAGING_DIR, "$ERR_STAGING" or die "$PID: Cannot open directory $ERR_STAGING"; 
@allfiles = grep !/^$ERR_STAGING\/\./, map "$ERR_STAGING/$_", readdir(ERR_STAGING_DIR); 
closedir(ERR_STAGING_DIR); 

$ERR_FILETYPE = basename ($ERR_FILETYPE); 

$ERR_FILETYPE =~ s/\./\\\./g; 
$ERR_FILETYPE =~ s/\*/\*/g; 

@file_type = grep /^$ERR_STAGING/./$ERR_FILETYPE$/, @allfiles; 
$numelements = @file_type; 
if ($numelements <= 0) { 
    print LOG "$PID: No files match specified pattern, exiting.\n"; 
    &HandlerDie($NO_FILE_TYPE, $current_poid); 
} 

여기 제가 위에서 설명합니다. grep ERR_STAGING 디렉토리의 모든 파일. grep 파일은 'BVN*.fin.bc_lerr.xml.bc'과 일치합니다 (예 : BVN_201608250000.fin.bc_lerr.xml.bc). 파일을 가지고 뭔가를하십시오. 그러나 위의 코드는 패턴과도 일치하지 않는 파일을 반환하고 있습니다. 또한 픽업 일부 임시 디렉토리입니다.

+0

어디 코드의 패턴'BVN * ...'? – Mike

+0

@Mike ERR_FILETYPE은 속성 파일에 설정된 변수입니다. $ ERR_FILETYPE = "BVN * .fin.bc_lerr.xml.bc"; – user2570205

+1

'$ ERR_STAGING' 변수에 정규식 메타 문자'\ |() [{^ $ * +? . 예기치 않은 행동을 취할 수 있습니다. 자세한 내용은 [quotemeta] (http://perldoc.perl.org/functions/quotemeta.html)를 참조하십시오. 리터럴 문자열과 일치시키려는 정규식을 항상 인용 할 것을 권장합니다. –

답변

1

올바른 두 개의 행 :

$ERR_FILETYPE =~ s/\*/.\*/g;      # Add DOT 

@file_type = grep /\/$ERR_FILETYPE$/, @allfiles; # such a filter is sufficient 
+0

완벽하게 작동합니다! – user2570205

1

나는 대안을 제시거야 - 당신이 패턴으로 'BVN*.fin.bc_lerr.xml.bc'을 언급.

하지만 정규 표현식이 아닙니다 (글쎄, 알았어.하지만 BVN 이후에 '0 이상'을 원하지 않는다고 확신합니다.). 그리고 당신은 그것을 정규 표현식으로 변환하려고 시도하는 것처럼 보입니다.

즉, 정규 표현식이 아닌 셸 glob를 실제로 찾고 있음을 의미합니다. 그들은 유사하지만 동일하지는 않습니다.

따라서 readdirgrep 대신 원하는 것을 glob으로 제안 할 수 있습니다.

다음을 수행 할 수 있습니다

my @files = glob ('/path/to/BVN*.fin.bc_lerr.xml.bc'); 

... 그리고 그게입니다. 그러면 로직이 아닌 정규식 로직을 사용하여 패턴을 확장 한 다음 /path/to을 읽어 해당 파일을 찾습니다. 그래서 예에서

:

my @files = glob ("$ERR_STAGING/$ERR_FILETYPE"); 
+0

이것은 너무 감각적입니다. – user2570205

관련 문제