<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">&lt;<a href="mailto:diogo86@gmail.com">diogo86@gmail.com</a>&gt;</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 &quot;()&quot; 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-&gt;{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 =&gt; 1, bar =&gt; 2 );<br>
my $scalar = &#39;teste&#39;;<br>
<br>
SubHashScalar ( %hash, $scalar );<br>
<br>
É a mesma coisa que:<br>
<br>
SubHashScalar ( &#39;foo&#39;, 1, &#39;bar&#39;, 2, &#39;teste&#39; );<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 &lt;<a href="mailto:cpaqui@gmail.com">cpaqui@gmail.com</a>&gt;:<br>
<div><div></div><div class="h5">&gt; Caros, boa tarde!<br>
&gt;<br>
&gt; Estou tendo problemas para passar dois parâmetros para uma sub, um hash e um<br>
&gt; scalar.<br>
&gt;<br>
&gt; SubHashScalar(%hash, $scalar);<br>
&gt;<br>
&gt; sub SubHshScalar () {<br>
&gt;     my (%hash, $scalar) = @_;<br>
&gt;<br>
&gt;     print &quot;@{[ %hash ]}\n&quot;;<br>
&gt;     printf &quot;Scalar: %s&quot;, $scalar;<br>
&gt; }<br>
&gt;<br>
&gt; O parâmetro scalar não esta sendo configurado, se eu do um print no @_<br>
&gt; imprime o hash e o scalar.<br>
&gt;<br>
&gt; O que estou fazendo de errado?<br>
&gt;<br>
&gt; Obrigado.<br>
&gt; --<br>
&gt; Cleive Paqui<br>
&gt;<br>
</div></div><div><div></div><div class="h5">&gt; _______________________________________________<br>
&gt; Rio-pm mailing list<br>
&gt; <a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
&gt; <a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
&gt;<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>