Como usar o comando grep para procurar múltiplos padrões em perl?

2

Como usar o comando grep para procurar vários campos no perl?

Eu tenho abaixo do arquivo

Arquivo1:

access abc permit tcp sourceipaddress sourcesubnet destipaddr destsubnet eq portnumber

Aqui estou dividindo com base em campos e grepping para esses campos em uma matriz, mas não parece funcionar (Tentei 4 maneiras diferentes que são comentadas abaixo, mas nada funcionou)

 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;
    
por Vibes 15.01.2018 / 07:07

1 resposta

2

O grep de Perl usa um bloco de código (*) e fornece os elementos da matriz como $_ ao bloco. /pattern/ corresponde implicitamente a $_ e podemos combinar as correspondências de padrão com && ou || . Então, isso deve funcionar:

my @foo = qw/abc cde efg ghi/;
printf("%s\n", join(" ",  grep {/c/ || /e/} @foo));
printf("%s\n", join(" ",  grep {/c/ && /e/} @foo));

O primeiro imprime os elementos de @foo que têm c ou e , o segundo imprime o que tem os dois.

(* ou uma expressão, mas eu acho a sintaxe do bloco mais clara)

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

Você está perdendo a chave de abertura aqui, e "$fld0" por si só não testa nada, exceto o conteúdo de $fld0 .

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

Eu acho que isso deve funcionar, é o mesmo que a minha segunda linha, exceto com uma expressão e não um bloco. Mas talvez você quisesse || em vez de && ?

    
por 15.01.2018 / 07:58

Tags