<br><br><div class="gmail_quote">Em 30 de junho de 2010 14:04, <a href="mailto:diogo86@gmail.com">diogo86@gmail.com</a> <span dir="ltr"><<a href="mailto:diogo86@gmail.com">diogo86@gmail.com</a>></span> escreveu:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
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></blockquote><div><br></div><div>Hummm... mais ou menos. Veja mais detalhes em perlsub</div><div><br></div><div>$ perldoc perlsub</div><div><br></div><div>ou </div><div><br></div><div><a href="http://perldoc.perl.org/perlsub.html">http://perldoc.perl.org/perlsub.html</a></div>
<div><br></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
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></blockquote><div><br></div><div>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...</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<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}.</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<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></blockquote><div><br></div><div><br></div><div>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.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<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></blockquote><div><br></div><div>Apoiado!</div><div><br></div><div>:D</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
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>
<div><div></div><div class="h5">> Caros, boa tarde!<br>
><br>
> Estou tendo problemas para passar dois parâmetros para uma sub, um hash 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>
</div></div><div><div></div><div class="h5">> _______________________________________________<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>