使用Perl从大型归档文件中提取单个

使用Perl从大型归档文件中提取单个,perl,extract,archive,tar,Perl,Extract,Archive,Tar,我正在从一个大的“.tgz”文件中尝试一个。我正在使用模块 下面是示例代码 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; } } 但是迭代器

我正在从一个大的“.tgz”文件中尝试一个。我正在使用模块

下面是示例代码

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;
   }
}
但是迭代器不起作用。它正在循环归档中的第一个文件,而不是移动到下一个文件。
有人能告诉我我在这里犯了什么错误吗?

您将对
next
的调用放在
if
中,因此仅当您提取文件时才会执行该调用。如果未提取文件,则循环中没有任何内容会修改
$fil

只需在while循环的条件下调用迭代器,就可以大大简化代码。此外,您还可以使用,而不是将名称存储在
$\uu
中。您不需要这里的
/g
正则表达式修饰符。在标量上下文中,可以使用
/g
循环一个字符串中的多个匹配项。这里,您只想知道字符串是否包含匹配项

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

您将对
next
的调用放在
if
中,因此只有在提取文件时才会执行该调用。如果未提取文件,则循环中没有任何内容会修改
$fil

只需在while循环的条件下调用迭代器,就可以大大简化代码。此外,您还可以使用,而不是将名称存储在
$\uu
中。您不需要这里的
/g
正则表达式修饰符。在标量上下文中,可以使用
/g
循环一个字符串中的多个匹配项。这里,您只想知道字符串是否包含匹配项

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


我的tgz文件具有以下结构folder1--folder2--folder3--file1--file2--file3,因此当我运行代码时,我得到的输出是folder1/folder2/folder3/file1 folder1/folder2/folder3/file1输出路径由
$outpath
控制。你不知道那是从哪里来的。忘了那$outpath。。即使我在那个地方打印文件名,它也会一次又一次地打印ttgx文件中的第一个文件。。。迭代器未移动到下一个文件。。请帮忙存档::Tar::Streamed不适用于存档中的递归文件夹???您可能在存档::Tar::Streamed中发现错误。我显示的代码不应该反复出现在同一个文件上。我的tgz文件具有以下结构folder1--folder2--folder3--file1--file2--file3,所以当我运行代码时,我得到的输出是folder1/folder2/folder3/file1 folder1/folder2/folder3/file1输出路径由
$outpath
控制。你不知道那是从哪里来的。忘了那$outpath。。即使我在那个地方打印文件名,它也会一次又一次地打印ttgx文件中的第一个文件。。。迭代器未移动到下一个文件。。请帮忙存档::Tar::Streamed不适用于存档中的递归文件夹???您可能在存档::Tar::Streamed中发现错误。我展示的代码不应该反复出现在同一个文件上。也许你可以使用
Archive::Tar
,它位于内核中,还具有某种流媒体支持,请参阅:我不能使用Archive::Tar,因为我的tgz文件大小超过8GB。我的内存有问题。你检查过链接了吗?它说“返回一个迭代器函数,该函数读取tar文件而不将其全部加载到内存中。”不知道这是否正确,但可能值得一试…@SlavenRezic。。是的,你是对的。。我的意思是迭代器在我的情况下不工作。“不工作”是一个无效的问题描述。确切的问题是什么?也许您可以使用
Archive::Tar
,它位于内核中,还具有某种流式传输支持,请参阅:我不能使用Archive::Tar,因为我的tgz文件大小超过8GB。我的内存有问题。你检查过链接了吗?它说“返回一个迭代器函数,该函数读取tar文件而不将其全部加载到内存中。”不知道这是否正确,但可能值得一试…@SlavenRezic。。是的,你是对的。。我的意思是迭代器在我的情况下不工作。“不工作”是一个无效的问题描述。到底是什么问题?