首页 > 解决方案 > 来自另一组的 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: 

标签: perl

解决方案


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

推荐阅读