Набор для печати на Perl из другого набора

#perl

#perl

Вопрос:

У меня есть этот скрипт, который в значительной степени просто печатает набор данных от вертикали до горизонтали.

Я хотел пропустить некоторые имена, которые не являются частью набора, который я хочу. Однако я хочу распечатать просто выберите инициалы, сохранив заказы.

 #!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper ;

my $filename = shift @ARGV ;
open(my $fh, '<', $filename) or die "Could not open file $filename $!";
while (<$fh>) {
        next if /^$/;
        chomp $_ ;
        print $_ ;
}
  

Псевдокод

 if $_ (is one of these WJ: DS: AP: ) 
   print $_
   else 
   skip, don't print 
  

Итак, из этого набора —

 LC:
NW:
DS:
AP:
II:
NW:
KB:
JK:
LC:
DS:
TM:
AP: 
WJ: 
  

Они НЕ будут распечатаны на терминале

 LC:
NW:
II:
NW:
KB:
JK:
TM:
  

Они будут напечатаны на терминале — горизонтально с сохранением порядка

 DS: AP: AP: WJ: 
  

Комментарии:

1. вы могли бы попробовать print if /(?:WJ|DS|AP):/

Ответ №1:

 next if !/^(?:AP|DS|WJ):z/;
  

Что, если мы не хотим жестко кодировать список.

Подготовка:

 my @to_keep = qw( AP DS WJ );
my $to_keep_alt = join '|', map quotemeta, @to_keep;
my $to_keep_re = qr/^(?:$to_keep_alt):z/;
  

В цикле:

 next if !/$to_keep_re/;
  

Альтернативный способ, который не требует жесткого кодирования списка.

Подготовка:

 my @to_keep = qw( AP DS WJ );
my %to_keep = map { "$_:" => 1 } @to_keep;
  

В цикле:

 next if !$to_keep{$_};
  

Комментарии:

1. Было ли это отменено. Исправлено.