[SP-pm] Grep ou Map?

Eden Cardim edencardim at gmail.com
Thu Jul 1 21:39:52 PDT 2010


>>>>> "Marcelo" == Marcelo Gigliotti <marcelo.gigliotti em gmail.com> writes:

    Marcelo> grep (!/$conf_local/, em conf_srv)
    Marcelo>   O problema é que neste caso... a função grep sempre está
    Marcelo> retornando true, mesmo não havendo a linha
    Marcelo> pesquisada... fiz alguns testes e descobri que ele não está
    Marcelo> procurando a string server apenas e não a linha inteira
    Marcelo> como desejo server 192.168.10.3

Não, o problema não é esse.
    
Vejamos... 

$conf_local = 'server 192.168.10.3'

Pro caso onde não existe uma linha que case com $conf_local:

@conf_srv = ('server 192.168.10.1', 'server 192.168.10.2');
grep !/$conf_local/, @conf_srv

a lista retornada é ('server 192.168.10.1', 'server 192.168.10.2')
Já que:

'192.168.10.1' =~ /server 192.168.10.3/ é falso e
!('192.168.10.1' =~ /server 192.168.10.3/) é verdadeiro

'192.168.10.2' =~ /server 192.168.10.3/ é falso e
!('192.168.10.2' =~ /server 192.168.10.3/) é verdadeiro

já que é uma lista com dois elementos, em contexto booleano vai resultar
em verdadeiro.

Pro caso onde existe uma linha que case com $conf_local:

@conf_srv = ('server 192.168.10.3', 'server 192.168.10.2');
grep !/$conf_local/, @conf_srv

a lista retornada é ('server 192.168.10.2')
Já que:

'192.168.10.3' =~ /server 192.168.10.3/ é verdadeiro e
!('192.168.10.3' =~ /server 192.168.10.3/) é falso

'192.168.10.2' =~ /server 192.168.10.3/ é falso e
!('192.168.10.2' =~ /server 192.168.10.3/) é verdadeiro

já que é uma lista com um elemento, em contexto booleano vai resultar
em verdadeiro.

O único caso onde grep(!/$conf_local/, @conf_srv) vai retornar
falso é se todos os elementos de @conf_srv casarem com '192.168.10.3'.

Acho que o que você está procurando é:

if(!grep { /$conf_local/ } @conf_srv) { etc... }

que vai retornar verdadeiro se não houver elemento algum que case com
$conf_local em @conf_srv. Na verdade, pra esses casos eu recomendo uma
função ou variável intermediária para facilitar a compreensão:

my @matches = grep { /$conf_local/ } @conf_srv;

if(!@matches) { etc... }

percebe-se imediatamente a diferença para:

my @non_matches = grep { !/$conf_local/ } @conf_srv;

if(!@non_matches) { etc... }


More information about the SaoPaulo-pm mailing list