Perl - 在条件下删除数组的行

时间:2016-04-13 10:04:15

标签: arrays perl

当列满足正则表达式时,如何删除数组的行?

示例:

'0','john','192.168.0.1'
'1','james','192.168.1.1'
'2','pat','192.168.0.1'

我想删除第三列中包含xxx.xxx.1.x的所有行(或保存不包含...的行)。

也许egrep将是最好的解决方案(因为我不想使用耗时的循环),但我不知道如何指定列和正则表达式。

2 个答案:

答案 0 :(得分:5)

你无法避免“耗时的循环” - 你认为“grep”的作用是什么,但是逐行循环 - 并进行测试?

但是,您可以使用perl grep函数,除了正则表达式之外,还允许使用代码解决方案。

所以这样的事情有效:

#!/usr/bin/env perl
use strict;
use warnings;

use Data::Dumper;

my @stuff = (
    [ '0', 'john',  '192.168.0.1' ],
    [ '1', 'james', '192.168.1.1' ],
    [ '2', 'pat',   '192.168.0.1' ]
);

print Dumper \@stuff;

my @new_array = grep { not $_->[2] =~ m/\.1\.\d+$/ } @stuff;

print "Entries which match:\n";
print Dumper \@new_array;

虽然没有幻想 - grep正在通过你的阵列'循环'。它只是隐藏了这就是它正在做的事实。 (egrep会做同样的事情,所以你不会丢失任何东西)。

答案 1 :(得分:0)

IP的正则表达式在第3位置为'1'可能是:

/\d{1,3}\.\d{1,3}\.1\.\d{1,3}/