<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>&nbsp;do Perlmonks e achei muito interessante e bastante útil. Ysth apresentou um código, que segue abaixo,&nbsp;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)&nbsp;&nbsp;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>&lt;code&gt;<br><font face="courier new,monospace">use Test::More&nbsp; &quot;no_plan&quot;;<br>use Devel::Size &quot;total_size&quot;;<br><br>my $val = &quot;a00&quot;;<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&nbsp;</font>( &quot;aa&quot; .. &quot;zz&quot;&nbsp;) {</font></div>
<div><font face="courier new,monospace">&nbsp;&nbsp;&nbsp; # popula o primeiro hash<br>&nbsp;&nbsp;&nbsp; $hash1{$key} = $val;</font></div>
<div><font face="Courier New"></font>&nbsp;</div>
<div><font face="courier new,monospace">&nbsp;&nbsp;&nbsp; # popula o segundo hash, agora utilizando</font></div>
<div><font face="courier new,monospace">&nbsp;&nbsp;&nbsp; # a captura de grupo do regex<br>&nbsp;&nbsp;&nbsp; &quot;$key$val&quot; =~ /(..)(...)/ and $hash2{$1} = $2;<br>&nbsp;&nbsp;&nbsp; ++$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), &quot;same numbe of keys&quot;);<br>is_deeply(\%hash1, \%hash2, &quot;is_deeply same&quot;);<br>is(total_size(\%hash1),total_size(\%hash2));
<br></font>&lt;/code&gt;</div>
<div>&lt;resultado&gt;</div>
<div><font face="courier new,monospace">ok 1 - same numbe of keys<br>ok 2 - is_deeply same<br>#&nbsp;&nbsp; Failed test in teste.pl at line 15.<br>not ok 3<br>1..3<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; got: &#39;39308&#39;<br>#&nbsp;&nbsp;&nbsp;&nbsp; expected: &#39;52828&#39;
<br># Looks like you failed 1 test of 3.</font></div>
<div>&lt;/resultado&gt;</div>
<div>&nbsp;</div>
<div>Para resolver o problema é só alterar a linha :</div>
<div><font face="Courier New">&nbsp;&nbsp;&nbsp; &quot;$key$val&quot; =~ /(..)(...)/ and $hash2{$1} = $2;</font></div>
<div><font face="">para :</font></div>
<div><font face="Courier New">&nbsp;&nbsp;&nbsp; &quot;$key$val&quot; =~ /(..)(...)/ and $hash2{$1} = &quot;$2&quot;;</font></div>
<div><font face="">... e aí o último teste será concluído com sucesso.</font></div>
<div>&nbsp;</div>
<div>E isso aí pessoal.</div>
<div>&nbsp;</div>
<div>Solli Moreira Honório</div>