<br><br><div><span class="gmail_quote">Em 29/02/08, <b class="gmail_sendername">André Garcia Carneiro</b> <<a href="mailto:andre.garcia.carneir@terra.com.br">andre.garcia.carneir@terra.com.br</a>> 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> 'sub{&op}' e 'my $cmd = \&op;'. Onde tem literatura sobre isso?</blockquote>
<div><br><span style="font-family: courier new,monospace;">Se eu compreendi a dúvida, no 'sub{&op}' você cria uma sub-anônima (coderef) executando a sub 'op'. Já no 'my $cmd = \&op;' você está atribuindo a referência da sub '&op' 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> <code><br> use strict;<br> .<br> .<br> .<br> sub applyrule {<br> use Date::Calc qw( :all );<br> my ($date,$rule) = @_;<br> $rule = lc $rule;<br> $rule = ucfirst $rule;<br> if(!$date || !$rule){<br>
throw Error::applyRule(-text => "Está(ão) faltando parâmetro(s)",-errortarget => "DATE:".$date.", RULE: ".$rule);<br> }<br> else{<br> my ($operation,$quantifier) = split /\ +/,$rule;<br>
my $cmd_table = {'Add' => sub{&Add_Delta_Days;}<br> ,'Sub' => sub{$quantifier *= -1;&Add_Delta_Days;}<br> };<br>
($date->{year},$date->{month},$date->{day}) =<br> $cmd_table->{$operation}->($date->{year},$date->{month},$date->{day},$quantifier);<br> return $date->{year}.$separator.sprintf('%02d',$date->{month}).$separator.sprintf('%02d',$date->{day});<br>
}<br> }<br> .<br> .<br> .<br> <br> </code><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 'sub' a partir de um hashref<br> <br><br> > André Garcia Carneiro wrote:<br>
> > Estou tentando fazer o seguinte. Eu tenho uma série de opções que o<br> > > meu usuário pode colocar como 'input', e gostaria de processá-las<br> > > como algo parecido com o código abaixo:<br>
><br> > > <code><br> > > use strict;<br> > > my $cmd_table = {'Add',\&add(1,2)};<br> > ><br> > > sub add { my ($v1,$v2) = @_;<br> > > my $result = $v1 + $v2; return $result;<br>
> > }<br> > ><br> > > </code><br> ><br> > André, não se pode criar referências para subrotinas passando parâmetros<br> > fixos desta forma. Se você quer uma referência para uma subrotina, use<br>
><br> > $coderef = \&minha_sub;<br> ><br> > Agora, se você precisa realmente dos parâmetros, você precisa usar um<br> > "closure":<br> ><br> > my $coderef_with_parameters = sub { minha_sub( $a, $b ); };<br>
><br> > Isso vai fazer com que minha_sub( $a, $b ) seja chamada com os valores<br> > que estavam em $a e $b no momento da atribuição a $coderef_with_parameters.<br> ><br> > > Claro que é só um exemplo. Mas o problema é que não estou entendendo<br>
> > como executar, e capturar o valor, quando chamo a sub 'add'. Por<br> > > exemplo:<br> > ><br> > > <code><br> > > my $userinput = shift;<br> > > my $result = $cmd->{$userinput};<br>
> > </code><br> ><br> > OK, se você quer executar mais tarde, precisa usar uma das duas<br> > alternativas acima, e, dependendo de qual você for usar aqui, faz assim:<br> ><br> > Se tiver escolhido guardar uma referência para a subrotina e não<br>
> parâmetros, você vai precisar passar parâmetros na hora de executar:<br> ><br> > $valor = $coderef->( $a, $b ); # executa como se fosse uma sub comum<br> ><br> > ou, se você escolheu usar a segunda forma, e guardar closures com a<br>
> chamada que você precisa fazer, pode chamar simplesmente a subrotina,<br> > sem parâmetros (já estão no lugar certo desde que você guardou a<br> > referência para a closure:<br> ><br> > $valor = $coderef_with_parameters->(); # não precisa de parâmetros<br>
><br> > > Alguém poderia me corrigir/explicar o que está acontecendo aqui, para<br> > > que eu possa tentar fazer funcionar?<br> ><br> > Bom, eu acho que você agora sabe o que está acontecendo, e como corrigir<br>
> o problema :) se você tiver perguntas, eu sei que você não vai deixar de<br> > fazê-las. ;)<br> ><br> > Putamplexos!<br> > --<br> > Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,<br>
> Perl fanatic evangelist, and amateur {cook, photographer}<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> ><br> <br> <br>--<br> André Garcia Carneiro<br> Developer(Perl/PHP)<br> Member of "São Paulo Perl Mongers" - <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>"o animal satisfeito dorme". - Guimarães Rosa