我使用以下内容来计算文件中模式的出现次数:
my @lines = grep /$text/, <$fp>;
print ($#lines + 1);
但有时它会打印比实际值多一个。我检查过,因为@lines
的最后一个元素为空,这也是计数。
有时候grep结果的最后一个元素是空的吗?此外,如何解决此问题?
答案 0 :(得分:6)
这在很大程度上取决于你的模式,但你可以做的一件事是加入几场比赛,第一场比赛取消任何只包含空格(或什么都没有)的线。此示例将拒绝任何空行,仅换行或仅有任何数量的空格。
my @lines = grep { not /^\s*$/ and /$test/ } <$fp>;
请记住,如果$ test的内容恰好包含regexp特殊元字符,则它们需要用于其元字符目的,或者使用quotemeta()
进行消毒。
我的理论是你可能在\ n中有一行以某种方式匹配你的$ text regexp,或者你的$ text regexp中包含影响匹配的元字符,而你却不知道。无论哪种方式,我提供的片段至少会强制拒绝“空白行”,其中空白可能意味着完全空(不太可能),换行符终止但是空(可能),或者包含(可能)行的空白在打印时显示为空白。
答案 1 :(得分:2)
与空字符串匹配的正则表达式将匹配undef
。 Perl会警告这样做,但会在尝试与之匹配之前将undef
强制转换为''
,此时grep
会很乐意将undef
提升为其结果。如果您不想拾取空字符串(或任何匹配的空字符串),则需要重写正则表达式以使其不匹配。
答案 2 :(得分:2)
要准确查看行中的内容,请执行以下操作:
use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper \@lines;
答案 3 :(得分:0)
好的,因为没有关于$text
(正则表达式)内容的更多信息即将发布,我想我会丢掉一些一般信息。
考虑以下示例:
use Data::Dumper;
my @array = (' ', 1, 2, 'a', '');
print Dumper [ grep /\s*/, @array ];
我们得到:
$VAR1 = [
' ',
1,
2,
'a',
''
];
所有值都匹配。为什么?因为它们也匹配空字符串。为了得到我们想要的,我们需要\s
或\s+
。 (两者之间没有实际区别)
你可能遇到这样的问题。