我想在 Perl 脚本中使用正则表达式在文件中搜索一行。
假设它在安装了 grep 的系统中,最好:
grep
通过open()
命令调用外部open()
直接文件并使用while
循环和if ($line =~ m/regex/)
?
在现代 Perl 实现中,regexp 代码应该和 grep 一样快,但是如果您关心性能,为什么不直接尝试一下呢?从代码清洁度和健壮性的角度来看,调用外部命令行工具肯定不好。
你不需要open
明确的文件。
my $regex = qr/blah/;
while (<>) {
if (/$regex/) {
print;
exit;
}
}
print "Not found\n";
由于您似乎关心性能,我让匹配并使用不分配给任何东西所提供print
的默认值,这稍微快一点。在正常的生产代码中,$_
<>
while (my $line = <>) {
if ($line =~ /$regex/) {
print $line;
exit;
}
}
将是首选。
编辑: 这假设要检查的文件是在命令行上给出的,我刚刚注意到你没有说它适用于你的情况。
使用 grep 需要注意的一件事:在最近的 Linux 发行版中,如果您的 LANG 环境变量定义了 UTF-8 类型(例如我的是 LANG=en_GB.UTF-8),那么 grep、sed、sort 和可能还有一堆其他文本-处理实用程序的运行速度要慢约 10 倍。因此,如果您正在进行性能比较,请注意这一点。我现在将我的 grep 命令别名为:
LANG= LANGUAGE= /bin/grep
编辑:实际上,它更像是慢了 100 倍
这取决于。
我会说在 Perl 中执行此操作,除非性能迫使您进行优化。
这取决于。如果您想优化开发时间,
$line = `grep '$regex' file | head -n 1`;
显然是要做的事情。
但它的代价是必须启动外部进程,这取决于除了安装 perl 之外的其他东西,并且在出现问题时失去了进行详细错误报告的机会。
我曾经编写了一个脚本来在一些大文本文件(每个大约 10 MB)中搜索一些正则表达式。我用 Perl 正则表达式完成了它,并注意到它运行得很慢。所以我尝试从脚本中运行 grep,速度提升非常可观。所以,根据我自己的经验,Perl 内置的正则表达式比 grep 慢。但是您可能只会在大文件中注意到它。我的建议是:尝试两种方式,看看效果如何。
sed '/pattern/q' file