2016-04-13 10 views
-3

列が正規表現を満たすときに配列の行を削除するにはどうすればよいですか?Perl - 条件の下で配列の行を削除する

例:

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

私は3番目の列にxxx.xxx.1.x含まれているすべての行削除したい(または含まない行を保存し...)

たぶん私は時間のかかるループを使いたくないので、egrepが最適な解決策になりますが、列と正規表現を指定する方法はわかりません。

+1

配列やファイルの行はありますか? – choroba

+0

試した正規表現を表示します – red0ct

+0

@choroba:配列のように、タイトルで... @ red0ct:私の質問は正規表現を偽造する方法ではなくgrepで正規表現を指定しようとしていました –

答えて

0

第三位の「1」かもしれないとIPのための正規表現:

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

あなたは「時間のかかるループ」を避けることができない - あなたは何を「グレップ」はないと思いますが、ループします - によって行をラインとテストを行う?

しかし、正規表現に加えて、コード解決も可能な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でも同じことができるので、何も失うことはありません)。

+0

ありがとう、それは完璧に動作します。私はperlにいくつかの微妙な点があることを知って以来、自分自身で作られたループを避けたいと思っていました。 –

関連する問題