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... <div><br></div><div>;-)</div><div><br></div><div>Cheers!<br><br><div class="gmail_quote">
Em 30 de junho de 2010 14:28, Rodrigo Mosconi (perl) <span dir="ltr"><<a href="mailto:perl@mosconi.mat.br">perl@mosconi.mat.br</a>></span> escreveu:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Mas a associação % não é do tipo "greedy"?<br>
<br>
e se inverter os parametros?<br>
<br>
sub func {<br>
my ($scalar, %hash) = @_;<br>
# iara iara iara...<br>
<br>
};<br>
<br>
<br>
2010/6/30 Andre Carneiro <<a href="mailto:andregarciacarneiro@gmail.com">andregarciacarneiro@gmail.com</a>>:<br>
<div><div></div><div class="h5">><br>
><br>
> Em 30 de junho de 2010 14:04, <a href="mailto:diogo86@gmail.com">diogo86@gmail.com</a> <<a href="mailto:diogo86@gmail.com">diogo86@gmail.com</a>><br>
> escreveu:<br>
>><br>
>> Cleive,<br>
>><br>
>> primeiro acho que você vai precisar tirar o protótipo "()" da<br>
>> definição da função, porque basicamente está dizendo que ela não<br>
>> recebe nenhum parâmetro.<br>
>><br>
><br>
> Hummm... mais ou menos. Veja mais detalhes em perlsub<br>
> $ perldoc perlsub<br>
> ou<br>
> <a href="http://perldoc.perl.org/perlsub.html" target="_blank">http://perldoc.perl.org/perlsub.html</a><br>
><br>
><br>
><br>
>><br>
>> Nesse ponto ficaria:<br>
>><br>
>> sub SubHashScalar { ... }<br>
>><br>
>> Quanto a passar o hash, tenho a impressão de que é mais comum passar<br>
>> por referência, fazendo a chamada com \ na frente, assim:<br>
><br>
> Acho que não é questão de ser comum ou não, o que se recomenda é que se<br>
> passe por referência, exatamente para evitar os problemas que mencionei no<br>
> e-mail anterior, e por outras questões como replicação de variáveis ,<br>
> vazemento de memória e outras cositas...<br>
><br>
>><br>
>> SubHashScalar( \%hash, $scalar );<br>
>><br>
>> E na hora de ler os parâmetros dentro da função:<br>
>><br>
>> my ( $hashref, $scalar ) = @_;<br>
>><br>
>> Ao acessar a referência dentro da função, ao invés de fazer<br>
>> $hash{chave} você acessa como $hashref->{chave}.<br>
>><br>
>> Pra realmente fazer do jeito que você quer, sem ser por referência,<br>
>> acho que você vai precisar tirar o último parâmetro da lista e depois<br>
>> montar o hash:<br>
>><br>
>> my $scalar = pop;<br>
>> my %hash = @_;<br>
><br>
><br>
> Humm, acho que não. Fica bem mais complicado assim, na minha opinião...Além<br>
> do mais ele deveria passar o hash como referência mesmo.<br>
><br>
>><br>
>> Isso porque quando você faz essa chamada:<br>
>><br>
>> my %hash = ( foo => 1, bar => 2 );<br>
>> my $scalar = 'teste';<br>
>><br>
>> SubHashScalar ( %hash, $scalar );<br>
>><br>
>> É a mesma coisa que:<br>
>><br>
>> SubHashScalar ( 'foo', 1, 'bar', 2, 'teste' );<br>
>><br>
>> De forma que estes parâmetros chegam como uma lista normal na variável @_.<br>
>><br>
>> Quando você tenta acessar com my ( %hash, $scalar ) = @_; o Perl, pelo<br>
>> visto, vai tentando montar o %hash com base nos pares da lista, onde o<br>
>> primeiro item do par é a chave e o segundo item do par é o valor.<br>
>><br>
>> Sendo assim, o seu último parâmetro vira uma chave do hash e, como não<br>
>> tem parceiro no par, o valor fica undef.<br>
>><br>
>> Depois de montado o %hash, a associação da ( lista ) fica sem mais<br>
>> itens pra ler na @_, então $scalar fica como undef.<br>
>><br>
>> Bem, não tenho certeza se o funcionamento interno é realmente esse,<br>
>> mas, por observação, acho que é assim que funciona.<br>
>><br>
>> Resumindo: melhor passar por referência mesmo :P<br>
>><br>
><br>
> Apoiado!<br>
> :D<br>
><br>
>><br>
>> Se tiver algum lugar onde precisa ter um hash, e não um hashref, você<br>
>> utiliza em %{ $hashref }, como em:<br>
>><br>
>> foreach my $chave ( keys %{ $hashref } ) { ... }<br>
>><br>
>><br>
>> abs,<br>
>> Diogo<br>
>><br>
>> 2010/6/30 GmailPaqui <<a href="mailto:cpaqui@gmail.com">cpaqui@gmail.com</a>>:<br>
>> > Caros, boa tarde!<br>
>> ><br>
>> > Estou tendo problemas para passar dois parâmetros para uma sub, um hash<br>
>> > e um<br>
>> > scalar.<br>
>> ><br>
>> > SubHashScalar(%hash, $scalar);<br>
>> ><br>
>> > sub SubHshScalar () {<br>
>> > my (%hash, $scalar) = @_;<br>
>> ><br>
>> > print "@{[ %hash ]}\n";<br>
>> > printf "Scalar: %s", $scalar;<br>
>> > }<br>
>> ><br>
>> > O parâmetro scalar não esta sendo configurado, se eu do um print no @_<br>
>> > imprime o hash e o scalar.<br>
>> ><br>
>> > O que estou fazendo de errado?<br>
>> ><br>
>> > Obrigado.<br>
>> > --<br>
>> > Cleive Paqui<br>
>> ><br>
>> > _______________________________________________<br>
>> > Rio-pm mailing list<br>
>> > <a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
>> > <a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
>> ><br>
>> _______________________________________________<br>
>> Rio-pm mailing list<br>
>> <a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
>> <a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
><br>
><br>
><br>
> --<br>
> André Garcia Carneiro<br>
> Analista/Desenvolvedor Perl<br>
> (11)82907780<br>
><br>
> _______________________________________________<br>
> Rio-pm mailing list<br>
> <a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
> <a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
><br>
_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>André Garcia Carneiro<br>Analista/Desenvolvedor Perl<br>(11)82907780<br>
</div>