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

相关问题