<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Breno, você é fora da realidade.<div><br></div><div>breno++</div><div><br><div>
<span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: Helvetica; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">-- <br>Software Engineer<br>Just Another Perl Hacker<br>Daniel Mantovani +5511 8538-9897<br>XOXO</div></span></div></span></span>
</div>
<br><div><div>On May 31, 2012, at 4:07 PM, breno wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>2012/5/31 Aureliano Guedes <<a href="mailto:guedes_1000@hotmail.com">guedes_1000@hotmail.com</a>>:<br><blockquote type="cite">Infelizmente isso foi como andar pra traz, na minha opinião. Eu não sabia<br></blockquote><blockquote type="cite">disso, alias ainda estou preso no perl 5.14.<br></blockquote><blockquote type="cite"><br></blockquote><br>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 feature.pm, 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><br><blockquote type="cite">Caso haja algum motivo para essa mudança, quando alguem descobrir me<br></blockquote><blockquote type="cite">explique.<br></blockquote><blockquote type="cite"><br></blockquote><br>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>"feature.pm" (ou o strict.pm, 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/feature.pl) 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/feature.pm e feature.h - são gerados<br>pelo regen/feature.pl, chamado via regen.pl.<br><br>Espero ter ajudado :)<br><br>[]s<br><br>-b<br>_______________________________________________<br>Rio-pm mailing list<br><a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>http://mail.pm.org/mailman/listinfo/rio-pm<br></div></blockquote></div><br></div></body></html>