我使用以下内容来计算文件中模式的出现次数:
my @lines = grep /$text/, <$fp>;
print ($#lines + 1);
Run Code Online (Sandbox Code Playgroud)
但有时它打印的比实际值多一个.我检查过它是因为最后一个元素@lines是null,这也是计算的.
有时候grep结果的最后一个元素是空的吗?此外,如何解决此问题?
这在很大程度上取决于你的模式,但你可以做的一件事是加入几场比赛,第一场比赛取消任何只包含空格(或什么都没有)的线.此示例将拒绝任何空行,仅换行或仅任何数量的空格.
my @lines = grep { not /^\s*$/ and /$test/ } <$fp>;
Run Code Online (Sandbox Code Playgroud)
请记住,如果$ test的内容恰好包含regexp特殊元字符,则它们需要用于其元字符目的,或者使用quotemeta().
我的理论是你可能在\n中有一行以某种方式匹配你的$ text regexp,或者你的$ text regexp中包含影响匹配的元字符,而你却不知道.无论哪种方式,我提供的片段至少会强制拒绝"空白行",其中空白可能意味着完全空(不太可能),换行符终止但是空(可能),或者包含(可能)行的空白在打印时显示为空白.