5

我想在 Perl 脚本中使用正则表达式在文件中搜索一行。

假设它在安装了 grep 的系统中,最好:

  • grep通过open()命令调用外部
  • open()直接文件并使用while循环和if ($line =~ m/regex/)
4

7 回答 7

9

在现代 Perl 实现中,regexp 代码应该和 grep 一样快,但是如果您关心性能,为什么不直接尝试一下呢?从代码清洁度和健壮性的角度来看,调用外部命令行工具肯定不好。

于 2008-12-13T14:50:03.187 回答
6

你不需要open明确的文件。

my $regex = qr/blah/;
while (<>) {
  if (/$regex/) {
    print;
    exit;
  }
}
print "Not found\n";

由于您似乎关心性能,我让匹配并使用不分配给任何东西所提供print的默认值,这稍微快一点。在正常的生产代码中,$_<>

while (my $line = <>) {
  if ($line =~ /$regex/) {
    print $line;
    exit;
  }
}

将是首选。

编辑: 这假设要检查的文件是在命令行上给出的,我刚刚注意到你没有说它适用于你的情况。

于 2008-12-13T16:43:19.357 回答
5

使用 grep 需要注意的一件事:在最近的 Linux 发行版中,如果您的 LANG 环境变量定义了 UTF-8 类型(例如我的是 LANG=en_GB.UTF-8),那么 grep、sed、sort 和可能还有一堆其他文本-处理实用程序的运行速度要慢约 10 倍。因此,如果您正在进行性能比较,请注意这一点。我现在将我的 grep 命令别名为:

LANG= LANGUAGE= /bin/grep

编辑:实际上,它更像是慢了 100 倍

于 2008-12-13T16:34:32.557 回答
3

这取决于。

  • 在 Perl 中工作可以为您节省进程启动时间和其他相关资源成本。
  • grep 可能比在 Perl 中做同样的工作要快,但不是很大。

我会说在 Perl 中执行此操作,除非性能迫使您进行优化。

于 2008-12-13T14:50:34.183 回答
3

这取决于。如果您想优化开发时间,

$line = `grep '$regex' file | head -n 1`;

显然是要做的事情。

但它的代价是必须启动外部进程,这取决于除了安装 perl 之外的其他东西,并且在出现问题时失去了进行详细错误报告的机会。

于 2008-12-14T06:50:07.067 回答
2

我曾经编写了一个脚本来在一些大文本文件(每个大约 10 MB)中搜索一些正则表达式。我用 Perl 正则表达式完成了它,并注意到它运行得很慢。所以我尝试从脚本中运行 grep,速度提升非常可观。所以,根据我自己的经验,Perl 内置的正则表达式比 grep 慢。但是您可能只会在大文件中注意到它。我的建议是:尝试两种方式,看看效果如何。

于 2008-12-15T20:33:40.073 回答
2
sed '/pattern/q' file
于 2010-04-01T17:12:02.303 回答