[Rio-pm] hash como parametro

Rodrigo Mosconi (perl) perl em mosconi.mat.br
Quarta Junho 30 10:28:24 PDT 2010


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
>


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