<br><br><div><span class="gmail_quote">Em 29/02/08, <b class="gmail_sendername">André Garcia Carneiro</b> &lt;<a href="mailto:andre.garcia.carneir@terra.com.br">andre.garcia.carneir@terra.com.br</a>&gt; escreveu:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Valeu Champs, funcionou!<br> <br> champs++<br> <br> Mas eu gostaria de aprender mais sobre isso, pois não ficou claro o conceito sobre as diferenças entre<br> &#39;sub{&amp;op}&#39; e &#39;my $cmd = \&amp;op;&#39;. Onde tem literatura sobre isso?</blockquote>
<div><br><span style="font-family: courier new,monospace;">Se eu compreendi a dúvida, no &#39;sub{&amp;op}&#39; você cria uma sub-anônima (coderef) executando a sub &#39;op&#39;. Já no &#39;my $cmd = \&amp;op;&#39; você está atribuindo a referência da sub &#39;&amp;op&#39; a variável.<br>
<br>O perlref mostra a questão do coderef.<br><br>Solli<br><br></span></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> Solução abaixo:<br>
 <br> &lt;code&gt;<br> use strict;<br> .<br> .<br> .<br> sub applyrule {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use Date::Calc qw( :all );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my ($date,$rule) = @_;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$rule = lc $rule;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$rule = ucfirst $rule;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!$date || !$rule){<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw Error::applyRule(-text =&gt; &quot;Está(ão) faltando parâmetro(s)&quot;,-errortarget =&gt; &quot;DATE:&quot;.$date.&quot;, RULE: &quot;.$rule);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my ($operation,$quantifier) = split /\ +/,$rule;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $cmd_table = {&#39;Add&#39;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; sub{&amp;Add_Delta_Days;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,&#39;Sub&#39;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; sub{$quantifier *= -1;&amp;Add_Delta_Days;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;($date-&gt;{year},$date-&gt;{month},$date-&gt;{day}) =<br> $cmd_table-&gt;{$operation}-&gt;($date-&gt;{year},$date-&gt;{month},$date-&gt;{day},$quantifier);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $date-&gt;{year}.$separator.sprintf(&#39;%02d&#39;,$date-&gt;{month}).$separator.sprintf(&#39;%02d&#39;,$date-&gt;{day});<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> }<br> .<br> .<br> .<br> <br> &lt;/code&gt;<br> <br> <br> <br> Cheers!<br> <br> <br> ---------- Cabeçalho original -----------<br> <br> De: saopaulo-pm-bounces+andre.garcia.carneir=<a href="mailto:terra.com.br@pm.org">terra.com.br@pm.org</a><br>
 Para: <a href="mailto:saopaulo-pm@mail.pm.org">saopaulo-pm@mail.pm.org</a><br> Cópia:<br> Data: Fri, 29 Feb 2008 16:57:01 +0100<br> Assunto: Re: [SP-pm] Executar uma &#39;sub&#39; a partir de um hashref<br> <br><br> &gt; André Garcia Carneiro wrote:<br>
 &gt; &gt; Estou tentando fazer o seguinte. Eu tenho uma série de opções que o<br> &gt; &gt; meu usuário pode colocar como &#39;input&#39;, e gostaria de processá-las<br> &gt; &gt; como algo parecido com o código abaixo:<br>
 &gt;<br> &gt; &gt; &lt;code&gt;<br> &gt;&nbsp;&nbsp;&gt; use strict;<br> &gt;&nbsp;&nbsp;&gt; my $cmd_table = {&#39;Add&#39;,\&amp;add(1,2)};<br> &gt; &gt;<br> &gt; &gt; sub add { my ($v1,$v2) = @_;<br> &gt; &gt;&nbsp;&nbsp; my $result = $v1 + $v2; return $result;<br>
 &gt; &gt; }<br> &gt; &gt;<br> &gt; &gt; &lt;/code&gt;<br> &gt;<br> &gt; André, não se pode criar referências para subrotinas passando parâmetros<br> &gt; fixos desta forma. Se você quer uma referência para uma subrotina, use<br>
 &gt;<br> &gt; $coderef = \&amp;minha_sub;<br> &gt;<br> &gt; Agora, se você precisa realmente dos parâmetros, você precisa usar um<br> &gt; &quot;closure&quot;:<br> &gt;<br> &gt; my $coderef_with_parameters = sub { minha_sub( $a, $b ); };<br>
 &gt;<br> &gt; Isso vai fazer com que minha_sub( $a, $b ) seja chamada com os valores<br> &gt; que estavam em $a e $b no momento da atribuição a $coderef_with_parameters.<br> &gt;<br> &gt; &gt; Claro que é só um exemplo. Mas o problema é que não estou entendendo<br>
 &gt; &gt; como executar, e capturar o valor, quando chamo a sub &#39;add&#39;. Por<br> &gt; &gt; exemplo:<br> &gt; &gt;<br> &gt; &gt; &lt;code&gt;<br> &gt; &gt;&nbsp;&nbsp;my $userinput = shift;<br> &gt;&nbsp;&nbsp;&gt;&nbsp;&nbsp;my $result = $cmd-&gt;{$userinput};<br>
 &gt; &gt; &lt;/code&gt;<br> &gt;<br> &gt; OK, se você quer executar mais tarde, precisa usar uma das duas<br> &gt; alternativas acima, e, dependendo de qual você for usar aqui, faz assim:<br> &gt;<br> &gt; Se tiver escolhido guardar uma referência para a subrotina e não<br>
 &gt; parâmetros, você vai precisar passar parâmetros na hora de executar:<br> &gt;<br> &gt; $valor = $coderef-&gt;( $a, $b ); # executa como se fosse uma sub comum<br> &gt;<br> &gt; ou, se você escolheu usar a segunda forma, e guardar closures com a<br>
 &gt; chamada que você precisa fazer, pode chamar simplesmente a subrotina,<br> &gt; sem parâmetros (já estão no lugar certo desde que você guardou a<br> &gt; referência para a closure:<br> &gt;<br> &gt; $valor = $coderef_with_parameters-&gt;(); # não precisa de parâmetros<br>
 &gt;<br> &gt; &gt; Alguém poderia me corrigir/explicar o que está acontecendo aqui, para<br> &gt; &gt; que eu possa tentar fazer funcionar?<br> &gt;<br> &gt; Bom, eu acho que você agora sabe o que está acontecendo, e como corrigir<br>
 &gt; o problema :) se você tiver perguntas, eu sei que você não vai deixar de<br> &gt; fazê-las. ;)<br> &gt;<br> &gt; Putamplexos!<br> &gt; --<br> &gt; Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,<br>
 &gt; Perl fanatic evangelist, and amateur {cook, photographer}<br> &gt; _______________________________________________<br> <br>&gt; SaoPaulo-pm mailing list<br> &gt; <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 &gt; <a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br> &gt;<br> <br> <br>--<br> André Garcia Carneiro<br> Developer(Perl/PHP)<br> Member of &quot;São Paulo Perl Mongers&quot; - <a href="http://sao-paulo.pm.org">http://sao-paulo.pm.org</a><br>
 <br> _______________________________________________<br> <br>SaoPaulo-pm mailing list<br> <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br> <a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
 </blockquote></div><br><br clear="all"><br>-- <br>&quot;o animal satisfeito dorme&quot;. - Guimarães Rosa