2013-09-21 1 views
1

큰 ".tgz"파일에서 하나의 파일을 추출하려고합니다. 나는 Archive::Tar::Streamed 모듈을 사용하고 있습니다.Perl을 사용하여 거대한 아카이브에서 단일 파일 압축 해제

다음은 샘플 코드입니다.

my $tar2 = Archive::Tar::Streamed->new($filename); 
$fil = $tar2->next; 
while($fil) { 
    $_ = $fil->name; 
    if(m/abc\.txt/g) { 
     $fil->extract($outpath); 
     $fil = $tar2->next; 
    } 
} 

그러나 이터레이터가 작동하지 않습니다. 다음 파일로 이동하지 않는 아카이브의 첫 번째 파일을 반복하고 있습니다. 누군가 내가 여기에서 한 실수를 말해 줄 수 있습니까 ???

+0

어쩌면 당신은 또한 핵심이며 아카이브 :: Tar'이 지원을 스트리밍의 어떤 종류가 '사용을 참조하십시오 https://metacpan.org/module/Archive::Tar#Archive를 : : Tar-iter-filename-compressed-opt-val –

+0

내 tgz 파일 크기가 8GB 이상이기 때문에 Archive :: Tar를 사용할 수 없습니다. 메모리 문제가 생깁니다. – wesfaith

+0

링크를 확인하셨습니까? "tar 파일을 메모리에 모두로드하지 않고 읽는 iterator 함수를 반환합니다." 그것이 사실인지 모르겠지만 시도해 볼만한 가치가 있습니다 ... –

답변

6

if 안에 next으로 전화를 걸면 파일을 추출한 경우에만 실행됩니다. 파일이 추출되지 않으면 루프 내에 $fil을 수정하는 것은 없습니다.

while 루프의 조건에서 반복기를 호출하면 코드를 간소화 할 수 있습니다. 또한 $_에 이름을 저장하는 대신 =~ binding operator을 사용할 수 있습니다. 그리고 당신은 하지 않습니다./g 정규식 수정자를 원합니다. 스칼라 컨텍스트에서는 /g을 사용하여 문자열에서 여러 일치를 반복합니다. 여기서 원하는 것은 문자열에 일치하는 항목이 있는지 여부를 확인하는 것입니다.

my $tar2 = Archive::Tar::Streamed->new($filename); 
while(my $fil = $tar2->next) { 
    if($fil->name =~ m/abc\.txt/) { 
     $fil->extract($outpath); 
    } 
} 
+0

안녕하세요 작동하지 않습니다. – wesfaith

+0

내 TGZ 파일은 다음과 같은 구조 ----- 파일 2 ----- 파일 3 ----- 파일 1 폴더 1 --folder2 ---- FOLDER3을 가지고 그래서 내가 통해 UR 코드를 실행하면, 출력을 얻는 메신저 folder1/folder2/folder3/file1 folder1/folder2/folder3/file1 – wesfaith

+1

출력 경로는'$ outpath'에 의해 제어됩니다. 그게 어디에서 왔는지 보여주지는 마세요. – cjm