如何忽略perl grep中的任何空值?

时间:2011-07-08 22:04:46

标签: arrays perl grep

我使用以下内容来计算文件中模式的出现次数:

my @lines = grep /$text/, <$fp>;
print ($#lines + 1);

但有时它会打印比实际值多一个。我检查过,因为@lines的最后一个元素为空,这也是计数。

有时候grep结果的最后一个元素是空的吗?此外,如何解决此问题?

4 个答案:

答案 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+。 (两者之间没有实际区别)

你可能遇到这样的问题。