[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