[Cascavel-pm] Idioma muito legal!!

Luis Campos de Carvalho lechamps em terra.com.br
Quarta Maio 19 21:45:05 CDT 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

From: "Nelson Ferraz" <nferraz em phperl.com>
To: "Cascavel Perl Mongers" <cascavel-pm em mail.pm.org>
Sent: Wednesday, May 19, 2004 7:48 PM
Subject: Re: [Cascavel-pm] Idioma muito legal!!
> Luis Campos de Carvalho wrote:
> >   Percebam como o sr. Schwartz percorre um hash de hashes SEM
usar EVAL 
> > (operação demorada e complicada) para incrementar o conteúdo do
escalar 
> > $top->{a}{b}{c}{d}{e}{count}:
> > 
> >         $x = $top;
> >         $x = $x->{$_} ||= {} for qw(a b c d e);
> >         $x->{count}++;
> 
> Calma aí... do jeito como está, a estrutura
$top->{a}{b}{c}{d}{e}{count} 
> não chega a ser criada...
> 
> Além disso, me parece que ele incrementou $x->{count}, e não 
> $top->{a}{b}{c}{d}{e}{count} . Não é isso?
> 
> Finalmente... como você faria para obter este mesmo resultado,
antes de 
> ler a dica do Schwartz?

   Nélson e Solli:

   Lamento informar, mas estão ambos errados. :-)
   Esta sugestão é do Randal Schwartz, e ele raramente erra um hack,
ainda mais um bonito como este.

  Reparem bem na expressão.
  Vejam a linha do meio:

  $x = $x->{$_} ||= {} for qw(a b c d e);

  $x recebe a referência da expressão "$x->{$_} ||= {}", que pode
inicializar automaticamente $x->{$_} para uma referência para um hash
anônimo "{}" ou retornar o valor atual desta variável. Como $_
percorre o array 'a'..'e', isso automaticamente cria todos os valores
indefinidos encontrados e é muito melhor que o monte de eval's que eu
usava para resolver a mesma expressão anteriormente... 

  Posso reescrever a expressão assim:

  # $x recebe a raiz da árvore
  $x = $top;
  # Percorre a árvore, top-down, escolhendo automaticamente
  # por quais "ramos" seguir. Cria todos os "ramos"
  # inexistentes até a folha procurada.
  foreach $letter ( qw ( a b c d e f ) ){
    my $aux = exists $x->{$_} ? $x->{$_} : {};
    $x = $aux;
  }
  # Incrementa um atributo da folha procurada.
  $x->{count}++;
  # Neste ponto, $x não contém uma referência para
  # a árvore de hash tables contida em $top, mas apenas
  # uma referência para um dos hashes que compõem a
  # estrutura representada (total ou parcialmente) por $top.

  Fica como exercício para os queridos leitores demonstrar que a
minha versão verborrágica do código faz a mesma coisa que a versão
enxuta do Randal.

  Ainda estou babando neste hack... Tenho vontade de usar árvores
n-árias e cadeias de Markov para resolver todos os problemas do
universo... eheh...

  Putamplexos a todos!
- -- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Luis Campos de Carvalho
Computer Scientist
Unix Sys Adm & OCP/DBA Oracle
http://br.geocities.com/monsieur_champs/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (MingW32) - WinPT 0.7.96rc1

iD8DBQFArBukz+iwwpKRaDIRAoJmAJ9Qg0XYrhU33qaVG+Vmt02FWF9zUACfQv3w
NmLcLOTGJQhyteQz5XfQxVU=
=ZnDf
-----END PGP SIGNATURE-----




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