【发布时间】: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) { … })可能是一个选项!