[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