2016-05-06 4 views
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"; 
} 

если, например, файл содержит

1 
3 
4 
5 
7 

и входной файл, который будет читаться из содержит

1 
2 
3 
4 
5 
6 
7 
8 
9 

Я хочу, чтобы напечатать 1,3,4,5 и 7 , но 1-9 печатаются вместо

UPDATE ****** Это мой код в настоящее время, и я получаю эту ошибку Readline() на закрытом файловом дескрипторе Тодда на ./may6test.pl линии 3.

#!/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"; 
} 

, который не имеет никакого смысла для меня, потому что у меня есть этот другой сценарий, который в основном делает то же самое

#!/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"; 
+2

Это почти то же самое, что и [этот] (http://stackoverflow.com/q/37079760/5830574), созданный 3 часа назад. Если вы один и тот же человек, я настоятельно рекомендую *** не удваивать пост *** из разных учетных записей. Кроме того, я рекомендую посмотреть те же самые вопросы, которые уже размещены на SO. – PerlDuck

+0

Правило большого пальца: избегайте использования '$ _' неявно или явно по этой причине. 'map' и' grep' являются исключениями, потому что требуется их использование. – Schwern

ответ

5

ОК, проблема здесь - grep наборы $_ тоже. Таким образом, grep { $_ } @array всегда будет давать вам каждый элемент массива.

На базовом уровне - вам нужно:

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

Но я бы предложил вместо этого вы можете рассмотреть вопрос о построении хеш ваших линий вместо:

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

Примечание - может захотеть наблюдать за трейлинг-линиями.