Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何快速找到与正则表达式匹配的文件的第一行?_Regex_Perl_Sed_Grep - Fatal编程技术网

Regex 如何快速找到与正则表达式匹配的文件的第一行?

Regex 如何快速找到与正则表达式匹配的文件的第一行?,regex,perl,sed,grep,Regex,Perl,Sed,Grep,我想在Perl脚本中使用正则表达式搜索文件中的一行 假设它位于安装了grep的系统中,是否最好: 通过open()命令调用外部grep open()直接打开文件,使用while循环和if($line=~m/regex/) 在现代的Perl实现中,regexp代码应该和grep一样快,但是如果您关心性能,为什么不试试呢?从代码干净性和健壮性的角度来看,调用外部命令行工具肯定不好。这取决于具体情况 在Perl内部工作可以节省进程启动时间和其他相关资源成本 grep可能比用Perl做同样的工作要快

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

假设它位于安装了grep的系统中,是否最好:

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

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

这取决于具体情况

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

除非性能迫使您进行优化,否则我建议您使用Perl进行优化。

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

LANG= LANGUAGE= /bin/grep

编辑:实际上,它的速度要慢100倍

您不需要显式地打开文件

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


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

视情况而定。如果您想优化开发时间

$line = `grep '$regex' file | head -n 1`;
这显然是应该做的事情


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

我曾经编写了一个脚本,在一些大文本文件(每个文件大约10 MB)中搜索一些正则表达式。我用Perl正则表达式做了这项工作,并注意到它运行得非常慢。所以我试着用脚本运行grep,速度提高了很多。因此,根据我自己的经验,Perl内置正则表达式比grep慢。但你可能只会注意到它与大文件。我的建议是:两种方法都试一下,看看效果如何。

速度稍微快一点,但使用非常全局的$并不值得10%(搜索/zebra/在240k行/usr/dict/words中测量)。如果您在while循环之外分配$line,则性能影响将消失。相反,请使用grep内置的
--max count=1
在第一次匹配时停止grepping。通过这种方式,您可以避免将文件处理到底的开销(这对于大型文件可能非常重要),以及启动另一个进程以运行
head-n1
的开销。这是一个GNU扩展。有用,但不一定总是存在
sed '/pattern/q' file
sed '/pattern/q' file