2013-09-21 38 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

我無法使用Archive :: Tar,因爲我的tgz文件大小超過8GB。我會記憶問題。 – wesfaith

+0

你檢查了鏈接嗎?它說:「返回讀取tar文件而不將其全部加載到內存中的迭代器函數。」不知道這是真的,但它可能是值得一試... –

回答

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文件具有以下結構 文件夾1 --folder2 ---- folder3 -----文件1 -----文件2 -----文件3 所以當我運行我們的代碼,即時獲取輸出爲, folder1/folder2/folder3/file1 folder1/folder2/folder3/file1 – wesfaith

+1

輸出路徑由'$ outpath'控制。你不顯示從哪裏來。 – cjm

相關問題