[Cascavel-pm] Como passar arrays para funções... [Was: Duvida $dbh->prepare]

Luis Motta Campos luismottacampos em yahoo.co.uk
Sexta Janeiro 26 05:14:12 PST 2007


On Jan 26, 2007, at 12:17 PM, Patty Silva wrote:
> Invez deu colocar ?=?  eu coloco $variavel=?
> Ai funcionou...

   Mais importante que funcionar é você entender por que.
   Entendeu por quê?

> So + uma duvida..

   /me lança um olhar de reprovação sobre todos os membros desta  
lista de discussão que não se preocuparam em mudar o tópico das  
mensagens, acompanhando a mudança de assunto e ao mesmo tempo  
permitindo que a lista continue se organizando por threads e assuntos.

   (Relaxa, Patty, que desta vez quem pisou no tomate foram as  
"raposas" da lista... eheheheh)

> em minha subrotina eu tento passar assim:
> my ($ids, em datas,$variavels)=@_;
>                       |______________________
>                                                                        
>     |
> Minha duvida eh.. eu posso passar um ARRAY??

   Patty, em Perl a gente pode fazer praticamente qualquer coisa.
   O problema é saber se interessa.

   Isso que você quer fazer é possível (desafio: alguém sabe COMO  
fazer? FGlock: você, não vale...), mas pode ficar chato de entender  
para outras pessoas.

   Existem duas possibilidades para resolver este problema:

   1. Coloque o seu array no final da lista de argumentos

   sub my_sub {
     my ( $a, $b, $c, @remaining ) = @_;
     # blah blah blah
   }

   e chama assim:

   my_sub( $d, $e, $f, $g, $h, $i, @jkl );

   E você vai acabar com os valores de $a em $d; $b em $e; $c em $f;  
e $g, $h, $i, e @remaining vão ser "agrupados", na ordem em que  
estão, em @jkl.


   2. Use referências:

   sub my_sub {
     my  ( $a, $b, @jkl ) = ( shift, shift, @{ +shift } );
     # bla bla bla
   }

   e chama assim:

   my_sub( $a, $b, \@remaining );

   A diferença é sutil: o operador '\' "constrói" referências, que  
são uma espécie de ponteiro seguro. Por outro lado, dentro da sub, o  
operador de de-referência de referências de array "@{}" faz o  
trabalho contrário, "transformando" a referência do array na "coisa"  
outra vez.

   Espero que esteja claro.
   Putamplexos.
--
Luis Motta Campos is software engineer,
perl fanatic evangelist, and amateur {cook, photographer}




Mais detalhes sobre a lista de discussão Cascavel-pm