[Cascavel-pm] REGEX retorna variáveis com tamanho maior que o conteúdo...

Solli Honorio shonorio em gmail.com
Segunda Janeiro 1 13:42:38 PST 2007


Pessoal,
Lí o post http://www.perlmonks.com/?node_id=592424 do Perlmonks e achei
muito interessante e bastante útil. Ysth apresentou um código, que segue
abaixo, demonstrando que o armazenamento de variáveis capturadas via REGEX
ocupam mais espaços do que o esperado.
Segundo a própria explicação dele, isto ocorre porque a variável passa por
uma transformação interna do tipo PV (tipo scalar)  para PVMG (um tipo
mágico, segundo a própria definição do B - The Perl Compiler
http://search.cpan.org/~nwclark/perl-5.8.8/ext/B/B.pm).
O interessante é que para resolver o problema, é só colocar as aspas-duplas
no momento da atribuição dos valores capturado pelo REGEX. Eu acredito que
esta informação possa ser muito interessante de parser de longos arquivos.
Dê uma olhada no código abaixo :
<code>
use Test::More  "no_plan";
use Devel::Size "total_size";

my $val = "a00";
my (%hash1,%hash2);
# cria um loop de aa..zz para popular
# dois hashes.
foreach my $key ( "aa" .. "zz" ) {
    # popula o primeiro hash
    $hash1{$key} = $val;

    # popula o segundo hash, agora utilizando
    # a captura de grupo do regex
    "$key$val" =~ /(..)(...)/ and $hash2{$1} = $2;
    ++$val;
}
# utiliza as funcoes do Test::More para garantir que
# os hashes populados possuem a mesma quantidade de
# elementos, e os mesmos elementos, mas neste caso
# com tamanho diferente.
is(keys(%hash1), keys(%hash2), "same numbe of keys");
is_deeply(\%hash1, \%hash2, "is_deeply same");
is(total_size(\%hash1),total_size(\%hash2));
</code>
<resultado>
ok 1 - same numbe of keys
ok 2 - is_deeply same
#   Failed test in teste.pl at line 15.
not ok 3
1..3
#          got: '39308'
#     expected: '52828'
# Looks like you failed 1 test of 3.
</resultado>

Para resolver o problema é só alterar a linha :
    "$key$val" =~ /(..)(...)/ and $hash2{$1} = $2;
para :
    "$key$val" =~ /(..)(...)/ and $hash2{$1} = "$2";
... e aí o último teste será concluído com sucesso.

E isso aí pessoal.

Solli Moreira Honório
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20070101/6822f46f/attachment.html 


Mais detalhes sobre a lista de discussão Cascavel-pm