我有这个脚本,它几乎只打印从垂直到水平的数据集。
我只是跳过一些不属于我想要的名称的名称。 但是,我想打印出来的只是选择姓名首字母,同时保留订单。
#!/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:
答案 0 :(得分:2)
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{$_};