2013-01-24 4 views
0

저는 Perl에 익숙하지 않지만 다음과 같이 작동해야한다고 생각합니다. 나는perl에서 와일드 카드 삭제

@mylist = ("${my_dir}AA_???_???.DAT", "${my_dir}AA???.DAT"); 

foreach my $list (@mylist) { 
    if (-e $list) { 
     system ("cp ${list} ${my_other_dir}"); 
    } 
} 

위의 코드 조각은 AA_???_???.DAT으로, 그 와일드 카드를 찾을 수 없습니다 더 큰 펄 스크립트의 다음 코드를 가지고 있지만 그것은 내가 시도 AA???.DAT

와일드 카드와 파일 이름을 찾을 수 않습니다 또한 파일을 삭제하면 AA??_???.DAT

unlink(glob(${my_dir}AA_???_???.DAT")) 

으로 표시되지만 스크립트가 끊어집니다.

unlink(glob("${my_dir}AA???.DAT)) 

어떤 이유가 될 수 :하지만 AA???.DAT 사용과 일치하는 파일을 삭제할 수있다?

+0

Perl 스크립트에는 항상 'use strict;'및 'use warnings;'이 있어야하며, 실제로 오류와 함께 도움이됩니다. – Perleone

+0

감사합니다. 나는 그것의 메모를 찍었습니다. !!! – Yacob

+0

내 대답은 Yacob을 사용합니까? –

답변

3

-e $list은 파일의 존재를 확인하므로 AA_???_???.DAT 또는 AA???.DAT에 대해 false를 반환합니다 (실제로 파일 이름이 정확히 지정되지 않은 경우). 하나가 작동하고 다른 하나는 그렇지 않은 것은 사실이 아닙니다.

unlink(glob(${my_dir}AA_???_???.DAT"))이 응답하지 않는 것도 사실입니다. 우선, 컴파일조차하지 않습니다. 디렉토리 재귀 파일에 대해

foreach my $list (@mylist) { 
    if (-e $list) { 
     system ("cp $some_dir/${list} ${my_other_dir}/"); 
    } 
} 

: 그럼 당신은 당신의 원본 코드에 연결할 수 있습니다

opendir(my $dh, $some_dir) || die "can't opendir $some_dir: $!"; 
@mylist = grep { /^(.AA_..._...\.DAT|AA...\.DAT)$/ && -f "$some_dir/$_" } readdir($dh); 
closedir $dh; 

:

+0

foreach my $ list (@mylist) { 시스템 ("cp $ {list} $ {my_other_dir}"); } 이것은 단순히 전화를 끊습니다. 모든 의견하시기 바랍니다! – Yacob

+0

구체적으로 매달린 것은 무엇입니까? 어떻게 알았어? – ikegami

0

나는 (문서의 예에서 수정)을 opendirreaddir 내장 함수를 사용합니다 operations File :: Find CPAN 모듈을 정말 사용하고 싶습니다. 이렇게하면 각 파일을 지정된 서브 루틴 으로 전달하는 하위 디렉터리를 통해 해당 파일을 처리합니다. 예를 들면 다음과 같습니다 :

#! /usr/bin/perl 

use strict; 
use warnings; 
use File::Find; 

my @dirs='/path/to/dir'; 
my $my_other_dir='/path/to/otherdir'; 

find(&process_files, @dirs); 

sub process_files { 
    my($file) = $_; 
    my($fullpath) = $File::Find::name; 

    return if($file !~ /^AA_..._...\.DAT$/ and 
     $file !~ /^AA...\.DAT$/); 

    system ("cp $fullpath $my_other_dir/"); 
} 
+0

나는 당신의 ['grep'] (http://p3rl.org/grep)에'/ \ A AA (? ​​: _..._)? '와 같은 패턴 일치를 작성했을 것입니다 ... [.] DAT \ z/x'. –

+0

안녕하세요, Drav, File :: Find 모듈을 사용하여 재귀 파일 작업을 실행하는 데 지쳐서, 다음 오류가 발생했습니다 : wildcard.pl 줄 55 패턴 일치 (m //) 초기화되지 않은 값 $ 파일 사용. /usr/share/perl/5.14/File/Find.pm 행 1064에 주어진 서브 루틴이없고 & 필요하지 않습니다. 55 행은 "if if return()"을 참조합니다. ....... " – Yacob

+0

잠시 동안 로그인하지 않은 경우, 잠깐 살펴보고 다시 연락하겠습니다. –