1

我正在尝试一个来自大型“.tgz”文件的单曲。我正在使用Archive::Tar::Streamed模块。

这是示例代码。

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;
   }
}

但是迭代器不起作用。它循环存档中的第一个文件,而不是移动到下一个文件。谁能告诉我我在这里犯了什么错误???

4

1 回答 1

6

你把调用next放在你的内部if,所以它只有在你提取文件时才会执行。$fil如果未提取文件,则循环内没有任何内容可以修改。

您可以通过在 while 循环的条件下调用迭代器来大大简化您的代码。此外,您可以使用=~绑定运算符而不是将名称存储在$_. 而且您希望在/g此处使用正则表达式修饰符。在标量上下文中,您/g可以循环遍历字符串中的多个匹配项。在这里,您只想知道字符串是否包含匹配项。

my $tar2 = Archive::Tar::Streamed->new($filename);
while(my $fil = $tar2->next) {
   if($fil->name =~ m/abc\.txt/) {
      $fil->extract($outpath);
   }
}
于 2013-09-21T17:22:36.183 回答