Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
File 使用Perl在多个文件中搜索字符串_File_Perl_Search_Grep - Fatal编程技术网

File 使用Perl在多个文件中搜索字符串

File 使用Perl在多个文件中搜索字符串,file,perl,search,grep,File,Perl,Search,Grep,Perl新手!!需要帮助:) 我有两个文件,每个大小接近500kb 我需要在这些文件中搜索一组字符串(大约800个字符串),以检查文件1、文件2中的字符串是否存在,或者两者都存在,或者两者都不存在 我知道的唯一选项是打开file1,逐行读取并检查其中是否存在字符串,然后对file2执行相同的操作。 对近800个字符串(搜索字符串)执行整个过程似乎既不好也不有效 是否有其他更有效的替代方案或使用PERL编写的单行代码?这里是一个使用PERL的示例。假设要匹配的字符串不跨多行,它将为每行可以检查的所

Perl新手!!需要帮助:) 我有两个文件,每个大小接近500kb

我需要在这些文件中搜索一组字符串(大约800个字符串),以检查文件1、文件2中的字符串是否存在,或者两者都存在,或者两者都不存在

我知道的唯一选项是打开file1,逐行读取并检查其中是否存在字符串,然后对file2执行相同的操作。 对近800个字符串(搜索字符串)执行整个过程似乎既不好也不有效

是否有其他更有效的替代方案或使用PERL编写的单行代码?

这里是一个使用PERL的示例。假设要匹配的字符串不跨多行,它将为每行可以检查的所有字符串创建一个公共正则表达式。因此,它只需要读取一次文件

use feature qw(say);
use strict;
use warnings;
use Regexp::Assemble;

my @strings = qw(abc efg);  # <- Add more strings here

my $ra = Regexp::Assemble->new;
$ra->add( $_ ) for @strings;  # <- Creates a regexp that matches all the strings..
my $re = $ra->re;
my @files = qw(file1.txt file2.txt);  # <- Add more files if needed..
my @matches;
for my $file (@files) {
    push @matches, get_matches( $file, $re );
}
# Now post process the matches as you like..

sub get_matches {
    my ( $fn, $re ) = @_;

    my %matches;
    open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
    while (my $line = <$fh>) {
        while ( $line =~ /($re)/g ) {
            $matches{$1}++;
        }
    }
    close $fh;
    return \%matches;
}
使用功能qw(比如说);
严格使用;
使用警告;
使用Regexp::Assemble;
我的@strings=qw(abc-efg)#新的;
$ra->为@strings添加($#)重新;

my@files=qw(file1.txt file2.txt);#对于这样的小文件,您可以使用它将它们读入一个字符串,然后一次查找800个单词;每个文件搜索800次,而不是每个文件中的每行搜索800次。文件有多大?800个字符串是普通的旧字符串,还是正则表达式?最后,在文件中,字符串是否必须逐字查找,或者是否存在空格(如换行符)的差异?这两个文件大约各为500kb,要搜索的所有字符串都是长度为12的普通字符串。当我们在这些文件中搜索这些字符串时,它们应该精确匹配,并且它们之间不会有任何空格。对不起,伙计们,我忘记了在搜索字符串时,我还需要记下找到字符串的行号。所以,如果我使用上面提到的File::Slurper方法,我能得到行号吗?