Здесь есть общая закономерность, и она такова: это проблема пересечений множеств, и поэтому она может быть легко решена с помощью «множеств» Perl, которые мы обычно называем хешами:).
Подход заключается в создании набора из одного из ваших файлов данных (т. Е. Индексации его в хеш-таблицу, например: %set = (a => 1, b => 1, c => 1)
, где фактическое значение не имеет значения, так как мы собираемся протестировать его с помощью ""установить оператор членства "exists
).
Как только вы это сделаете, достаточно просто просмотреть другой набор данных и проверить членство одного из его ключей (в вашем случае, идентификаторов источника) в%set
выше.
Итак, при условии, что файл карты канала имеет следующий формат:
ID,NAME
, а файл идентификатора источника - только один идентификатор наТаким образом, вы можете сделать следующее:
open my $CHANNEL_MAP, q{<}, $channel_map_file_name or die $!;
my %channel_map
= map {
chomp;
my @mapping = split /,/;
$mapping[0] => $mapping[1] # not needed, just being explicit.
} <$CHANNEL_MAP>;
close $CHANNEL_MAP or die $!;
# source ID file passed as a command line argument
while (<>) {
chomp;
print "$_ = $channel_map{$_}\n"
if exists $channel_map{$_};
}
Однако, это кажется немного бессмысленным, так как все, что вам нужно, это фильтровать файл карты канала по существующим идентификаторам источника.В этом случае вы могли бы просто индексировать файл идентификатора источника (используйте описанную выше методику), а затем просто просмотреть файл сопоставления каналов и распечатать каждую строку, для которой существует идентификатор в ваших идентификаторах источника.