[Rio-pm] hash como parametro

Andre Carneiro andregarciacarneiro em gmail.com
Quarta Junho 30 10:31:16 PDT 2010


Você passou o hash como segundo parâmetro, meu caro... Então Perl vai montar
o hash com o que vier no segundo parâmetro em diante...

;-)

Cheers!

Em 30 de junho de 2010 14:28, Rodrigo Mosconi (perl)
<perl em mosconi.mat.br>escreveu:

> Mas a associação % não é do tipo "greedy"?
>
> e se inverter os parametros?
>
> sub func {
>  my ($scalar, %hash) = @_;
>  # iara iara iara...
>
> };
>
>
> 2010/6/30 Andre Carneiro <andregarciacarneiro em gmail.com>:
> >
> >
> > 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
> >
> > _______________________________________________
> > 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/bb21895c/attachment.html>


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