我想在Perl脚本中使用正则表达式在文件中搜索一行。
假设它在安装了grep的系统中,最好是:
grep
命令open()
直接open()
该文件并使用while
循环和if ($line =~ m/regex/)
?答案 0 :(得分:9)
在现代Perl实现中,正则表达式代码应该与grep一样快,但如果你关注性能,为什么不简单地尝试一下呢?从代码清洁度和健壮性的角度来看,调用外部命令行工具绝对不是好事。
答案 1 :(得分: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;
}
}
将是首选。
编辑:这假定要检查的文件是在命令行上给出的,我刚刚注意到你没有说明你的情况。
答案 2 :(得分:5)
使用grep时要注意的一件事:在最近的Linux发行版中,如果你的LANG环境变量定义了UTF-8类型(例如我的是LANG = en_GB.UTF-8)那么grep,sed,sort和可能是一堆其他文本处理实用程序运行速度大约慢10倍。如果您正在进行性能比较,请注意这一点。我现在将我的grep命令别名:
LANG= LANGUAGE= /bin/grep
编辑:实际上,它更像是慢100倍
答案 3 :(得分:3)
取决于。
除非性能迫使你进行优化,否则我会说要用Perl来做。
答案 4 :(得分:3)
这取决于。如果您想优化开发时间,
$line = `grep '$regex' file | head -n 1`;
显然是要做的事情。
但它的代价是必须启动外部进程,这取决于安装perl之外的东西,并且在出现问题时失去了进行详细错误报告的机会。
答案 5 :(得分:2)
sed '/pattern/q' file
答案 6 :(得分:1)
我曾经做过一个脚本来搜索一些大文本文件(每个大约10 MB)的正则表达式。我用Perl正则表达式做到了,并注意到它很慢。所以我尝试从脚本中运行grep,速度提升相当可观。因此,根据我自己的经验,Perl内置正则表达式比grep慢。但你可能只会注意到大文件。我的建议是:尝试两种方式,看看它是怎么回事。