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 に答える