#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. Было ли это отменено. Исправлено.