[SP-pm] Novidade Perl 5.10
Lucas Mateus
lucasmateus.oliveira em gmail.com
Segunda Novembro 19 06:29:14 PST 2007
Entre as novidades do Perl 5.10 (cujo release candidate 1 chegou ao
CPAN neste sábado -
http://search.cpan.org/~rgarcia/perl-5.10.0-RC1/<http://search.cpan.org/%7Ergarcia/perl-5.10.0-RC1/>),
temos um novo
operador. É o operador '//' conhecido como operador 'default' ou
'defined-or'.
O propósito deste operador é muito similar ao operador '||' (que
corresponde a um OU) com algumas diferenças sutis e úteis.
O operador '||' é avaliado assim
exp1 || exp2 = exp1, se o resultado da exp1 é verdadeiro
exp1 || exp2 = exp2, caso contrário
Como este operador existe há muito tempo no Perl é muito comum que ele
seja usado quando é desejável que uma expressão tenha um certo valor
(ou 'default') se ele não for especificado explicitamente.
Por exemplo,
sub rule {
my $n = $_[0];
my $char = $_[1] || '-';
return $char x $n;
}
constrói uma régua de $n caracteres com o caracter especificado ou '-'.
Assim,
rule(3) retorna '---'
rule(4,'+') retorna '++++'
No entanto,
rule(5, 0) retorna '-----'
porque 0 é *falso* (assim como os outros valores de falso: '' - o
string vazio, 0 - zero inteiro, 0.0 - zero em ponto flutuante, undef).
Antes, a solução era trocar a expressão simples " $_[1] || '-' " por
um mais complicada e precisa:
my $char = defined $_[1] ? $_[1] || '-'; # atenção ao jogo para
evitar os efeitos colaterais do shift
Mas a semântica do operador '//' é exatamente esta:
exp1 || exp2 = exp1, se o resultado da exp1 é definido (não é 'undef')
exp1 || exp2 = exp2, caso contrário
Então a expressão corrigida fica mais concisa e elegante:
my $char = $_[1] // '-';
Assim, para inúmeras aplicações que antes empregariam o '||' com o
temor de que outros valores de falso levassem a surpresas, a melhor
alternativa é agora o uso do 'defined-or'.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/saopaulo-pm/attachments/20071119/e5e1e281/attachment-0001.html
Mais detalhes sobre a lista de discussão SaoPaulo-pm