[Rio-pm] hash como parametro

Andre Carneiro andregarciacarneiro em gmail.com
Quarta Junho 30 10:24:01 PDT 2010


Em 30 de junho de 2010 14:04, diogo86 em gmail.com <diogo86 em gmail.com>escreveu:

> Cleive,
>
> primeiro acho que você vai precisar tirar o protótipo "()" da
> definição da função, porque basicamente está dizendo que ela não
> recebe nenhum parâmetro.
>
>
Hummm... mais ou menos. Veja mais detalhes em perlsub

$ perldoc perlsub

ou

http://perldoc.perl.org/perlsub.html





> Nesse ponto ficaria:
>
> sub SubHashScalar { ... }
>
> Quanto a passar o hash, tenho a impressão de que é mais comum passar
> por referência, fazendo a chamada com \ na frente, assim:
>

Acho que não é questão de ser comum ou não, o que se recomenda é que se
passe por referência, exatamente para evitar os problemas que mencionei no
e-mail anterior, e por outras questões como replicação de variáveis ,
vazemento de memória e outras cositas...


>
> SubHashScalar( \%hash, $scalar );
>
> E na hora de ler os parâmetros dentro da função:
>
> my ( $hashref, $scalar ) = @_;
>
> Ao acessar a referência dentro da função, ao invés de fazer
> $hash{chave} você acessa como $hashref->{chave}.


> Pra realmente fazer do jeito que você quer, sem ser por referência,
> acho que você vai precisar tirar o último parâmetro da lista e depois
> montar o hash:
>
> my $scalar = pop;
> my %hash = @_;
>


Humm, acho que não. Fica bem mais complicado assim, na minha opinião...Além
do mais ele deveria passar o hash como referência mesmo.


>
> Isso porque quando você faz essa chamada:
>
> my %hash = ( foo => 1, bar => 2 );
> my $scalar = 'teste';
>
> SubHashScalar ( %hash, $scalar );
>
> É a mesma coisa que:
>
> SubHashScalar ( 'foo', 1, 'bar', 2, 'teste' );
>
> De forma que estes parâmetros chegam como uma lista normal na variável @_.
>
> Quando você tenta acessar com my ( %hash, $scalar ) = @_; o Perl, pelo
> visto, vai tentando montar o %hash com base nos pares da lista, onde o
> primeiro item do par é a chave e o segundo item do par é o valor.
>
> Sendo assim, o seu último parâmetro vira uma chave do hash e, como não
> tem parceiro no par, o valor fica undef.
>
> Depois de montado o %hash, a associação da ( lista ) fica sem mais
> itens pra ler na @_, então $scalar fica como undef.
>
> Bem, não tenho certeza se o funcionamento interno é realmente esse,
> mas, por observação, acho que é assim que funciona.
>
> Resumindo: melhor passar por referência mesmo :P
>
>
Apoiado!

:D



> Se tiver algum lugar onde precisa ter um hash, e não um hashref, você
> utiliza em %{ $hashref }, como em:
>
> foreach my $chave ( keys %{ $hashref } ) { ... }
>
>
> abs,
> Diogo
>
> 2010/6/30 GmailPaqui <cpaqui em gmail.com>:
> > Caros, boa tarde!
> >
> > Estou tendo problemas para passar dois parâmetros para uma sub, um hash e
> um
> > scalar.
> >
> > SubHashScalar(%hash, $scalar);
> >
> > sub SubHshScalar () {
> >     my (%hash, $scalar) = @_;
> >
> >     print "@{[ %hash ]}\n";
> >     printf "Scalar: %s", $scalar;
> > }
> >
> > O parâmetro scalar não esta sendo configurado, se eu do um print no @_
> > imprime o hash e o scalar.
> >
> > O que estou fazendo de errado?
> >
> > Obrigado.
> > --
> > Cleive Paqui
> >
> > _______________________________________________
> > Rio-pm mailing list
> > Rio-pm em pm.org
> > http://mail.pm.org/mailman/listinfo/rio-pm
> >
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>



-- 
André Garcia Carneiro
Analista/Desenvolvedor Perl
(11)82907780
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20100630/f28f7c07/attachment.html>


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