Perl脚本grep

0 perl grep

脚本正在打印输入行的数量,我希望它打印另一个文件中存在的输入行数量

#!/usr/bin/perl -w
open("file", "text.txt"); 
        @todd = <file>;         
        close "file";
while(<>){
        if( grep( /^$_$/, @todd)){
        #if( grep @todd, /^$_$/){
                print $_;
        }
        print "\n";
}
Run Code Online (Sandbox Code Playgroud)

如果例如文件包含

1
3
4
5
7
Run Code Online (Sandbox Code Playgroud)

和将从中读取的输入文件包含

1
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)

我希望它打印1,3,4,5和7,但1-9正在打印

更新******现在这是我的代码,我在./may6test.pl第3行关闭文件句柄上获取此错误readline().

#!/usr/bin/perl -w
open("todd", "<text.txt");
        @files = <todd>;         #file looking into
        close "todd";
while( my $line = <> ){
        chomp $line;
        if ( grep( /^$line$/, @files) ) {
                print $_;
        }
        print "\n";
}
Run Code Online (Sandbox Code Playgroud)

这对我没有意义,因为我有另一个基本上做同样事情的脚本

#!/usr/bin/perl -w
open("file", "<text2.txt");    #
        @file = <file>;         #file looking into
        close "file";           #
while(<>){
        $temp = $_;
        $temp =~ tr/|/\t/;      #puts tab between name and id
        my ($name, $number1, $number2) = split("\t", $temp);
        if ( grep( /^$number1$/, @file) ) {
                print $_;
        }
}
print "\n";
Run Code Online (Sandbox Code Playgroud)

Sob*_*que 5

好的,这里的问题是 - grep设置$_.所以grep { $_ } @array总会给你数组中的每个元素.

在基础层面 - 您需要:

while ( my $line = <> ) { 
   chomp $line; 
   if ( grep { /^$line$/ } @todd ) { 
      #do something
   }
}
Run Code Online (Sandbox Code Playgroud)

但我建议您改为考虑构建一行哈希值:

open( my $input, '<', "text.txt" ) or die $!;
my %in_todd = map { $_ => 1 } <$input>;
close $input;
while (<>) {
   print if $in_todd{$_};
}
Run Code Online (Sandbox Code Playgroud)

注意 - 您可能想要查看尾随换行符.