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

Joenio Marques joenio em gmail.com
Terça Janeiro 2 10:29:46 PST 2007


Hummnn...
Isto explica este problema que relatei a algum tempo atras:

http://mail.pm.org/pipermail/cascavel-pm/2005-December/004514.html

Att,

2007/1/1, Solli Honorio <shonorio em gmail.com>:
> 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
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
>


-- 
Joenio Marques
- Salvador Perl Mongers


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