【问题标题】:Use Archive::Zip to determine if a member is a text file or not使用 Archive::Zip 确定成员是否为文本文件
【发布时间】:2016-04-22 04:00:48
【问题描述】:

我正在编写一个脚本,当成员名称与模式匹配时,该脚本将使用给定的搜索字符串对 zip 存档成员的内容进行 grep。

我有以下处理单个存档的子程序(脚本可以在命令行上获取多个存档):

sub processArchive($$$$) {
    my ($zip, $searchstr, $match, $zipName) = @_;
    print "zip[$zip] searchstr[$searchstr] match[$match] zipName[$zipName]\n";
    my @matchingList = $zip->membersMatching($match);
    my $len = @matchingList;
    if ($len > 0) {
       print $zipName . ":\n";
       for my $member (@matchingList) {
          print "member[$member]\n";
          print "textfile[" . $member->isTextFile() . "] contents[" . $member->contents() . "]\n";
          if ($member->isTextFile()) {
             print "Is a text file.\n";
          }
          else {
             print "Is not a text file.\n";
          }
          my @matchingLines = grep /$searchstr/, $member->contents();
          my $len = @matchingLines;
          if ($len > 0) {
             print @matchingLines;              
          }
      }
   }
}

逻辑还不完整。我首先尝试调用“isTextFile()”来查看它的作用。我一定是做错了什么,因为我得到“不是文本文件”的至少一个成员显然是一个文本文件。

我还注意到,当我打印“isTextFile()”的返回值时,它始终是一个空字符串。这是我对打印“真”或“假”值的期望,还是这里有其他问题?

【问题讨论】:

  • 永远不要使用 Perl 原型。他们不会做你认为他们会做的事,而且你很可能会引入虚假错误。只是sub processArchive { ... } 是正确的
  • 如果您习惯使用实验性功能,子例程 签名(例如,sub processArchive ($zip, $searchstr, $match, $zipName) { … })可能是一个选项!

标签: perl zip


【解决方案1】:

“文本文件”状态是从 ZIP 文件中的标志读取的。许多归档工具没有正确设置此标志,因为它很少使用并且对正常使用没有影响。

如果您确实需要检查文件是否包含文本,则需要将其提取并自己查看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 2022-01-21
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多