<div><font face="verdana">Pessoal,<br></font></div>
<div><font face="verdana">Lí o post <a href="http://www.perlmonks.com/?node_id=592424">http://www.perlmonks.com/?node_id=592424</a> 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.
<br></font></div>
<div><font face="verdana">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
</font><a href="http://search.cpan.org/~nwclark/perl-5.8.8/ext/B/B.pm"><font face="verdana">http://search.cpan.org/~nwclark/perl-5.8.8/ext/B/B.pm</font></a><font face="verdana">).<br></font></div>
<div><font face="verdana">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.
<br></font></div>
<div><font face="verdana">Dê uma olhada no código abaixo :<br></font></div>
<div><code><br><font face="courier new,monospace">use Test::More "no_plan";<br>use Devel::Size "total_size";<br><br>my $val = "a00";<br>my (%hash1,%hash2);<br></font></div>
<div><font face="courier new,monospace"># cria um loop de aa..zz para popular </font></div>
<div><font face="courier new,monospace"># dois hashes.<br>foreach my <font face="Courier New">$key </font>( "aa" .. "zz" ) {</font></div>
<div><font face="courier new,monospace"> # popula o primeiro hash<br> $hash1{$key} = $val;</font></div>
<div><font face="Courier New"></font> </div>
<div><font face="courier new,monospace"> # popula o segundo hash, agora utilizando</font></div>
<div><font face="courier new,monospace"> # a captura de grupo do regex<br> "$key$val" =~ /(..)(...)/ and $hash2{$1} = $2;<br> ++$val;<br>}<br></font></div>
<div><font face="courier new,monospace"># utiliza as funcoes do Test::More para garantir que</font></div>
<div><font face="courier new,monospace"># os hashes populados possuem a mesma quantidade de </font></div>
<div><font face="courier new,monospace"># elementos, e os mesmos elementos, mas neste caso</font></div>
<div><font face="courier new,monospace"># com tamanho diferente.<br>is(keys(%hash1), keys(%hash2), "same numbe of keys");<br>is_deeply(\%hash1, \%hash2, "is_deeply same");<br>is(total_size(\%hash1),total_size(\%hash2));
<br></font></code></div>
<div><resultado></div>
<div><font face="courier new,monospace">ok 1 - same numbe of keys<br>ok 2 - is_deeply same<br># Failed test in teste.pl at line 15.<br>not ok 3<br>1..3<br># got: '39308'<br># expected: '52828'
<br># Looks like you failed 1 test of 3.</font></div>
<div></resultado></div>
<div> </div>
<div>Para resolver o problema é só alterar a linha :</div>
<div><font face="Courier New"> "$key$val" =~ /(..)(...)/ and $hash2{$1} = $2;</font></div>
<div><font face="">para :</font></div>
<div><font face="Courier New"> "$key$val" =~ /(..)(...)/ and $hash2{$1} = "$2";</font></div>
<div><font face="">... e aí o último teste será concluído com sucesso.</font></div>
<div> </div>
<div>E isso aí pessoal.</div>
<div> </div>
<div>Solli Moreira Honório</div>