grepコマンドを使用してPerlから複数のパターンを取得するには?

grepコマンドを使用してPerlから複数のパターンを取得するには?

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));

@foo1 つ目はまたは を使用してc要素を印刷し、e2 つ目は両方を使用して要素を印刷します。

(*または式ですが、ブロック構文がより明確であると思います)


#my @gitLines = grep "$fld0" && $_ =~ "$sIP" && $_ =~ "$dIP" && $_ =~ "$fld5"} @gitFile;

ここに開く中括弧が欠けており、それ"$fld0"自体は$fld0

#my @gitLines = grep /$fld0/ && /$sIP/ && /$dIP/ && /$fld5/, @gitFile;

私はこれが本当にうまくいくべきだと思います。ブロックの代わりに式を使用することを除いて、2行目と同じです。しかし、たぶんあなたはそれを||代わりにしたいですか&&

おすすめ記事