Uma coisa que ainda me irrita um pouco é a falta de assinatura de funções em Perl. Quando eu já estava me acostumando com parâmetros tipados e começava a desejar type hint para retorno de métodos, no Perl parece que não temos nada disso.
Os argumentos de funções chegam no array @_. Dentro da função você precisa pegar os argumentos dessa lista e fazer as validações necessárias.
Exemplo:
sub escrever_dados {
my ($nome, $cidade) = @_;
print "Nome: $nome, cidade: $cidade\n";
}
escrever_dados('Mary', 'Rio de Janeiro');
A função nesse caso recebe uma lista e os seus elementos são passados para as variáveis locais.
O que mais me incomoda é que parâmetros a mais ou a menos na chamada à função não resultam em erro algum. O que pode ser feito é validar dentro da função a quantidade e tipo dos parâmetros, mas torna o código extremamente repetitivo e mais sujeito a erros.
sub escrever_dados {
if (scalar @_ != 2) {
print "Função espera 2 argumentos\n";
return 0;
}
my ($nome, $cidade) = @_;
print "Nome: $nome, cidade: $cidade\n";
}
escrever_dados('Mary', 'Rio de Janeiro', 'Vai dar erro');
escrever_dados('Também vai dar erro');
escrever_dados(); # Lista vazia (scalar 0) também dá erro
A não ser que alguém conheça uma forma melhor. Alguém? Alguém?
Como o @_ é uma lista normal, qualquer forma de acesso é válida:
sub saudacao {
my $nome = shift;
print "Oi, $nome!\n";
}
saudacao('Mundo');
sub erro {
die "Erro inesperado $_[0]\n";
}
erro('Valor inválido!');
Mas ainda acho que associar as variáveis na forma my ($nome, $cidade) = @_; fica mais claro. Exceto quando estamos trabalhando com objetos, aí acho mais claro fazer my $self = shift; antes. Mas aí já é outra história.
Divirta-se.
novembro 16, 2008 às 7:40 pm |
Hahah, pois é rapaz, é uma neglicência só!