В основном та же идея, что и у ikegami, но с подпрограммой и некоторой удобной обработкой аргументов.
Основная идея - прочитать полную запись, установив в качестве разделителя записи $/
входной разделитель записей "\n**\n"
, превратить эту запись в хеш, сохранить значения NU
и использовать их для последующего поиска , Обратите внимание на использование режима переключения на eof
.
Я жестко закодировал ввод для CD
, но изменив его на my $CD = shift;
, вы сможете сделать:
script.pl 15 CD.txt NU.txt > outputfile
Я не слишком люблю использовать разделитель входных записей, так как он довольно негибкий и чувствителен к повреждению данных, такому как пропущенные символы новой строки в eof. Но до тех пор, пока данные непротиворечивы, проблем не должно быть.
Использование:
script.pl CD.txt NU.txt > outputfile
Где CD.txt
- это файл, в который вы извлекаете значения NU
для поиска в NU.txt
.
Код:
use strict;
use warnings;
my $CD = 15;
my %NU;
my $read = 1;
local $/ = "\n**\n";
while (<>) {
next unless /\S/; # no blank lines
my %check = record($_);
if ($read) {
if ($check{'CD'} == $CD) {
$NU{$check{'NU'}}++;
}
} else {
if ($NU{$check{'NU'}}) {
print;
}
}
$read &&= eof;
}
sub record {
my $str = shift;
chomp $str; # remove record separator **
return map(split(/ /, $_, 2), split(/\n/, $str));
}