<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
Breno++, foi bem didatico e preciso na explicação. Apesar de ser algo mais complexo para alguem como eu que não sou da area de computação, consegui entender. Obrigado.<br><br><br><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">From: creaktive@gmail.com<br>Date: Thu, 31 May 2012 16:24:38 -0300<br>To: rio-pm@pm.org<br>Subject: Re: [Rio-pm] variável $^H no Perl 5.16<br><br>É exatamente isso que eu queria saber!!! Valeu!<div><br><div>++breno :D<br clear="all"><br>ABS()<br><br>
<br><br><div class="ecxgmail_quote">2012/5/31 breno <span dir="ltr"><<a href="mailto:breno@rio.pm.org">breno@rio.pm.org</a>></span><br><blockquote class="ecxgmail_quote" style="border-left:1px #ccc solid;padding-left:1ex">

2012/5/31 Aureliano Guedes <<a href="mailto:guedes_1000@hotmail.com">guedes_1000@hotmail.com</a>>:<br>
<div class="ecxim">> Infelizmente isso foi como andar pra traz, na minha opinião. Eu não sabia<br>
> disso, alias ainda estou preso no perl 5.14.<br>
><br>
<br>
</div>Por quê? Como o Stan claramente apontou, é uma variável SOMENTE para<br>
uso interno. No código demonstrado ele quebrou encapsulamento 2 vezes<br>
(uma ao mexer no $^H e outra ao futucar no namespace dos outros no %^H<br>
- e escrevendo, ainda?! Stan malvado! Stan malvado!). A verdade é que<br>
ele sabia disso e por isso deixou claro que só queria entender o que<br>
estava acontecendo, e não reclamando da mudança. Se você não modifica<br>
o fonte do perl ou depura internas do <a href="http://feature.pm" target="_blank">feature.pm</a>, não deveria estar<br>
usando nada disso. Se, pelo contrário, você está usando a API pública<br>
(que por sinal não só é mais clara como tem menos caracteres<br>
envolvidos):<br>
<br>
   use feature 'say';<br>
<br>
ou<br>
<br>
   use feature ':5.10';<br>
<br>
ou ainda:<br>
<br>
   use v5.14;<br>
<br>
tudo continua funcionando normalmente.<br>
<div class="ecxim"><br>
> Caso haja algum motivo para essa mudança, quando alguem descobrir me<br>
> explique.<br>
><br>
<br>
</div>O Fernando tem razão e isso está relacionado com a nova feature (essa<br>
sim pública) do 5.16, que ativa somente as features de uma determinada<br>
versão. Mais especificamente, ao fato de que agora escrever "use<br>
VERSAO" carrega as features daquela versão sem precisar carregar o<br>
"<a href="http://feature.pm" target="_blank">feature.pm</a>" (ou o <a href="http://strict.pm" target="_blank">strict.pm</a>, no caso de >= 5.14)<br>
<br>
Aos mais curiosos que quiserem continuar lendo, cuidado: algumas<br>
entranhas serão expostas :)<br>
<br>
Antes de começar vale lembrar que estamos falando de duas variáveis<br>
diferentes, $^H (que contém dicas para o interpretador na forma de<br>
flags) e %^H (para implementação de pragmas em escopo léxico,<br>
armazenando valores de estado na optree).<br>
<br>
A mudança aconteceu no final do ano passado. A idéia, até onde<br>
entendi, é que o compilador agora reserva 3 bits no $^H para definição<br>
dos chamados "feature bundles". Ou seja, se eu tenho "use v5.16" ele<br>
vai passar a dica que, dentro daquele escopo léxico, somente<br>
determinadas features estarão ativas. Quais são ativadas e quais não<br>
são é o que fica nas chaves (privadas) 'feature_X' dentro do %^H.<br>
Agora, portanto, o $^H precisa indicar ao interpretador se ele deve<br>
usar as features definidas no %^H ou não. Se você não define, ele<br>
entende como se não estivesse ativando feature alguma, independente do<br>
que está no %^H. O valor é 0x1c000000 pq "ativa" 3 bits sequenciais em<br>
binário (11100000000000000000000000000), usados para definir a máscara<br>
padrão. Note, por exemplo, que se você colocar em $^H um outro valor<br>
que também ative a flag de features, elas funcionarão normalmente via<br>
%^H:<br>
<br>
perl -e 'BEGIN { $^H |= 0x1e2aff0d; $^H{feature_say} = 1; }; say $^V'<br>
v5.16.0<br>
<br>
Mais especificamente, se você definir um bundle padrão diferente da<br>
máscara, ele vai escolher o bundle conforme o valor posicional do<br>
número deslocado 26 bits para a direita (o tamanho da máscara) em<br>
@feature::hint_bundles, que hoje vale qw( default 5.10 5.11 5.15 ). Ou<br>
seja, podemos fazer:<br>
<br>
perl -e 'BEGIN { $^H |= 0x08000000; $^H{feature_say} = 1; }; say $^V'<br>
v5.16.0<br>
<br>
Já que 0x08000000 (hexa) é 1000000000000000000000000000 (binário) e<br>
isso >> 26 vale 10 (2, em decimal), indicando que vai usar as features<br>
do $hint_bundles[2], ou seja, 5.11. Analogamente, não ter a flag<br>
definida é o mesmo que definir $^H{feature_say} com a máscara<br>
'default' (000) ativa.<br>
<br>
Na prática, o feature.h (também gerado pelo regen/<a href="http://feature.pl" target="_blank">feature.pl</a>) usa<br>
essas flags para definir quais features estão ativas em um determinado<br>
momento (macros FEATURE_BUNDLE_CUSTOM e CURRENT_FEATURE_BUNDLE). Se<br>
você não usar um feature bundle, ele assume o default, que no momento<br>
é ativar apenas a feature 'array_base' (independente do que esteja no<br>
%^H). Outra interessante consequência dessas modificações é permitir<br>
que uma nova versão do perl desative determinada feature. Por exemplo,<br>
escrever "use v5.16" desativa a variável $[ (disponível em versões<br>
anteriores). Caso realmente precise usá-la, basta fazer "use v5.16;<br>
use feature qw(array_base);"<br>
<br>
Quem quiser ver as modificações, estão em torno do commit 23a52d6b1d1.<br>
Os arquivos pertinentes - lib/<a href="http://feature.pm" target="_blank">feature.pm</a> e feature.h - são gerados<br>
pelo regen/<a href="http://feature.pl" target="_blank">feature.pl</a>, chamado via <a href="http://regen.pl" target="_blank">regen.pl</a>.<br>
<br>
Espero ter ajudado :)<br>
<br>
[]s<br>
<span class="ecxHOEnZb"><font color="#888888"><br>
-b<br>
</font></span><div class="ecxHOEnZb"><div class="h5">_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
</div></div></blockquote></div><br></div></div>
<br>_______________________________________________
Rio-pm mailing list
Rio-pm@pm.org
http://mail.pm.org/mailman/listinfo/rio-pm</div>                                    </div></body>
</html>