来自另一套的Perl打印套

时间:2019-04-22 13:39:52

标签: 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 个答案:

答案 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{$_};