[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