Perlでgrepコマンドを使用して複数のフィールドを取得する方法は?
次のファイルがあります
ファイル1:
access abc permit tcp sourceipaddress sourcesubnet destipaddr destsubnet eq portnumber
ここでは、フィールドに基づいて分割し、配列内でそのフィールドを探していますが、動作しないようです。以下に説明する4つの異なる方法を試しましたが、何も機能しません。
my @columns = split(' ',$line);
my $fld0 = $columns[3];
my $fld3 = $columns[6];
my $fld5 = $columns[9];
#my @gitLines = grep "$fld0" && $_ =~ "$sIP" && $_ =~ "$dIP" && $_ =~ "$fld5"} @gitFile;
#my @gitLines = @gitFile =~ /$fld0|$sIP|$dIP|$fld5/;
#my @gitLines = grep /$fld0/ && /$sIP/ && /$dIP/ && /$fld5/, @gitFile;
#grep {$fld0} && {$sIP} && {$dIP} && {$fld5} @gitFile;
ベストアンサー1
Perlはgrep
コードブロック(*)$_
を受け入れ、ブロックに関連付けられた配列要素を提供します。/pattern/
暗黙的な一致$_
、&&
パターン一致、またはを組み合わせることができます||
。したがって、以下が機能します。
my @foo = qw/abc cde efg ghi/;
printf("%s\n", join(" ", grep {/c/ || /e/} @foo));
printf("%s\n", join(" ", grep {/c/ && /e/} @foo));
@foo
1 つ目はまたは を使用してc
要素を印刷し、e
2 つ目は両方を使用して要素を印刷します。
(*または式ですが、ブロック構文がより明確であると思います)
#my @gitLines = grep "$fld0" && $_ =~ "$sIP" && $_ =~ "$dIP" && $_ =~ "$fld5"} @gitFile;
ここに開く中括弧が欠けており、それ"$fld0"
自体は$fld0
。
#my @gitLines = grep /$fld0/ && /$sIP/ && /$dIP/ && /$fld5/, @gitFile;
私はこれが本当にうまくいくべきだと思います。ブロックの代わりに式を使用することを除いて、2行目と同じです。しかし、たぶんあなたはそれを||
代わりにしたいですか&&
?