我正在使用以下内容来计算文件中某个模式出现的次数:
my @lines = grep /$text/, <$fp>;
print ($#lines + 1);
但有时它会比实际值多打印一个。我查了一下,这是因为
@lines
的最后一个元素为空,这也算在内。grep 结果的最后一个元素有时如何为空?另外,这个问题如何解决?
最佳答案
这在很大程度上取决于您的模式,但您可以做的一件事是加入几场比赛,第一场比赛取消任何仅包含空格(或不包含任何内容)的行的资格。此示例将拒绝任何空行、仅换行符或任何数量的空白行。
my @lines = grep { not /^\s*$/ and /$test/ } <$fp>;
请记住,如果 $test 的内容碰巧包含正则表达式特殊元字符,则它们要么需要用于其元字符目的,要么使用
quotemeta()
进行 sanitizer 。 .我的理论是,您可能有一行以\n 结尾,它以某种方式与您的 $text regexp 匹配,或者您的 $text regexp 包含在您不知情的情况下影响匹配的元字符。无论哪种方式,我提供的代码段至少会强制拒绝“空白行”,其中空白可能意味着完全空白(不太可能),换行符终止但否则为空(可能),或者包含(可能)行的空白在打印时显示为空白。
关于arrays - 如何忽略 perl grep 中的任何空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631043/