<pre>Agora teremos SWITCH sem importação de classe.<br></pre><br><pre>given ($foo) {<br> when (/^abc/) { $abc = 1; }<br> when (/^def/) { $def = 1; }<br> when (/^xyz/) { $xyz = 1; }<br> default { $nothing = 1; }
<br> }</pre><br><br>---------- Forwarded message ----------<br><span class="gmail_quote">From: <b class="gmail_sendername">Lucas Mateus</b> <<a href="mailto:lucasmateus.oliveira@gmail.com">lucasmateus.oliveira@gmail.com
</a>><br>Date: 19/11/2007 11:29<br>Subject: Novidade Perl 5.10<br>To: <a href="mailto:saopaulo-pm@mail.pm.org">saopaulo-pm@mail.pm.org</a><br><br></span>Entre as novidades do Perl 5.10 (cujo release candidate 1 chegou ao
<br>CPAN neste sábado -<br><a href="http://search.cpan.org/%7Ergarcia/perl-5.10.0-RC1/" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)">
http://search.cpan.org/~rgarcia/perl-5.10.0-RC1/</a>), temos um novo<br>operador. É o operador '//' conhecido como operador 'default' ou<br>'defined-or'.<br><br>O propósito deste operador é muito similar ao operador '||' (que
<br>corresponde a um OU) com algumas diferenças sutis e úteis.<br><br>O operador '||' é avaliado assim<br><br>exp1 || exp2 = exp1, se o resultado da exp1 é verdadeiro<br>exp1 || exp2 = exp2, caso contrário<br>
<br>Como este operador existe há muito tempo no Perl é muito comum que ele<br>seja usado quando é desejável que uma expressão tenha um certo valor<br>(ou 'default') se ele não for especificado explicitamente.<br>
<br>
Por exemplo,<br><br>sub rule {<br> my $n = $_[0];<br> my $char = $_[1] || '-';<br> return $char x $n;<br>}<br><br>constrói uma régua de $n caracteres com o caracter especificado ou '-'.<br>
<br>Assim,<br><br>rule(3) retorna '---'<br>rule(4,'+') retorna '++++'<br><br>No entanto,<br><br>rule(5, 0) retorna '-----'<br><br>porque 0 é *falso* (assim como os outros valores de falso: '' - o
<br>string vazio, 0 - zero inteiro, 0.0 - zero em ponto flutuante, undef).<br><br>Antes, a solução era trocar a expressão simples " $_[1] || '-' " por<br>um mais complicada e precisa:<br><br> my $char = defined $_[1] ? $_[1] || '-'; # atenção ao jogo para
<br>evitar os efeitos colaterais do shift<br><br>Mas a semântica do operador '//' é exatamente esta:<br><br>exp1 || exp2 = exp1, se o resultado da exp1 é definido (não é 'undef')<br>exp1 || exp2 = exp2, caso contrário
<br><br>Então a expressão corrigida fica mais concisa e elegante:<br><br> my $char = $_[1] // '-';<br><br>Assim, para inúmeras aplicações que antes empregariam o '||' com o<br>temor de que outros valores de falso levassem a surpresas, a melhor
<br>alternativa é agora o uso do 'defined-or'.<br>