[SP-pm] Novidade Perl 5.10

Lucas Mateus lucasmateus.oliveira em gmail.com
Segunda Novembro 19 06:51:12 PST 2007


Agora teremos SWITCH sem importação de classe.


given ($foo) {
        when (/^abc/) { $abc = 1; }
        when (/^def/) { $def = 1; }
        when (/^xyz/) { $xyz = 1; }
        default { $nothing = 1; }
    }



---------- Forwarded message ----------
From: Lucas Mateus <lucasmateus.oliveira em gmail.com>
Date: 19/11/2007 11:29
Subject: Novidade Perl 5.10
To: saopaulo-pm em mail.pm.org

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/5ac4b758/attachment.html 


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