[Rio-pm] hash como parametro

diogo86 em gmail.com diogo86 em gmail.com
Quarta Junho 30 10:04:40 PDT 2010


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.

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:

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 = @_;

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

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
>


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