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

Caio Marcelo cmarcelo em gmail.com
Sexta Janeiro 26 07:17:10 PST 2007


On 1/26/07, André Garcia Carneiro <andre.garcia.carneir em terra.com.br> wrote:
>
> Desculpe a intromissão, mas não entendi a declaração da sua sub, principalmente os parênteses, poderia
> esclarecer, por gentileza?

Claro. Eu tava meio de saída para almoço e não deu tempo para
explicar. Esse pedaço em parênteses na declaração chama-se
"protótipo", vagamente ele se parece com
os protótipos de funções em C, que são assim:

int f(int a, int b, char c);

O prototipo em C especifica o que pode ser passado para a função. Em
Perl eles tem
um papel um pouco diferente. Eles são dicas para o
interpretador/compilador fazer
a "coisa certa".

A referência padrão é:
http://perldoc.perl.org/perlsub.html#Prototypes-prototype-subroutine%2c-prototype
ou "perldoc perlsub" e procurar por "Prototypes". Lá tem muita coisa a respeito.

Vamos ver a função "g" a seguir:

> sub g ($\@$) {
> my ($a, $bb, $c) = @_;
> my @b = @$bb;
> print "$a | @b | $c\n";
> }

O protótipo ($\@$) diz que a função g espera receber um escalar,
depois uma referência para um array e depois outro escalar. O migué é
que como o interpretador já sabe disso, ele deixa você mandar um array
ao invés de uma referência para array no segundo argumento:

> g('Perl', @lista, 'Cascavel');

Se você fosse fazer uma função igual a push, ela provavelmente teria
que usar protótipos para ficar igual a original, algo como "empurra
(\@@) { ... }". Nesse
caso dentro da função você terá uma referência ao primeiro array (para poder
empurrar coisas nele) e uma lista com as coisas a serem empurradas, mas na hora
de chamar você pode usar:

empurra @coisas, 'Sapato', 'Colher', 'Xícara';

Achei também um link que parece bom e dá mais detalhes também:
http://library.n0i.net/programming/perl/articles/fm_prototypes/

Espero ter jogado um pouco de luz na situação.


Cheers,
Caio Marcelo


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