for循环以匹配数组中所需的记录值

时间:2014-06-23 13:09:59

标签: perl

我想打印那些有5个管道分隔符和名字匹配到CHINA的记录。 我尝试过以下方法,但没有输出。

my @country_records = (
    'CHINA|hk|UK|pak|ind|arg',
    'HK|UK|Pak|ARG|Nep',
    'Lon|WC|Chile|SA',
    'CHINA|hk|UK|pak|arg|ind',
    'CHINA|AFg|UK|pak|arg',
);

for my $item (@county_records) {
    my $value =  q( awk -F '|' -v string=CHINA 'NF == 5 && $item == string' );
    my $record = system($value);
    print $item;
}

2 个答案:

答案 0 :(得分:3)

无需为此调用awk:

my @items = split /\|/, $item, -1;
if ((@items == 6) && ($items[0] eq 'CHINA')) {
    print $item;
}
split字符上的

|然后检查它是否有6个项目,第一个是CHINA

答案 1 :(得分:1)

非AWK,使用Perl正则表达式匹配:

my @counrty_records = (
    'CHINA|hk|UK|pak|ind|arg'
  , 'HK|UK|Pak|ARG|Nep'
  , 'Lon|WC|Chile|SA'
  , 'CHINA|hk|UK|pak|arg|ind'
  , 'CHINA|AFg|UK|pak|arg'
);

foreach ( @counrty_records ) {
  print $_ . '<br>' if $_ =~ /^CHINA(\|[^\|]*){5}$/;
}

循环管道分隔记录数组,打印以&#34; CHINA&#34;开头的记录。 (区分大小写),后跟5个管道分隔符,每个分隔符后跟0个或更多非管道符。

如果您希望匹配CHINA不区分大小写,请添加&#34; i&#34;改性剂:

/^CHINA(\|[^\|]*){5}$/i