[SP-pm] atalhos toscos

Stanislaw Pusep creaktive at gmail.com
Tue Oct 5 17:40:01 PDT 2010


> > perl -e '$x = 10; while ($x) { $x= ~-$x; print "$x\n" }'
> >
> > Código alternativo para contagens regressivas.
> > "~-$x" decrementa $x desde que $x seja diferente de 0. Por extenso, seria
> > "(~(-$x))".
>
> perl -le'print for reverse 0..10'
>

Pois isso, sim, seria totalmente ineficiente e é um caso onde o velho e bom
for($i=10;$i;$i--) seria o mais apropriado em todos os sentidos :)


>
> > perl -le 'print ~~localtime'
> >
> > "~~" força o contexto escalar. No caso do "localtime", que retorna array
> no
> > contexto "normal", porém retorna string no contexto escalar, vai retornar
> a
> > data e a hora por extenso. No caso do array, retorna o seu último
> elemento.
> > Me arrisco a dizer que equivale ao velho e bom 'scalar'.
>
> Equivale, mas é menos eficiente, o que você está fazendo é invertendo
> os bits do valor duas vezes. O primeiro operador ~ força o contexto
> escalar e inverte os bits, o segundo "desinverte".
>
> > perl -lne '$s+ =()= /\S+/g }{ print $s'
> >
> > "=()=", sucedido de um array, retorna o número de elementos no mesmo. Por
> > extenso, são tantos parenteses que parece o Lisp; nem me arrisco a tentar
> > entender :/
>
> Veja a explicação no post anterior. No caso, é a lista que retorna a
> contagem, caso esteja em contexto escalar, esse truque aí apenas força
> o contexto primeiro de lista para obter os matches, depois escalar
> para obter a contagem.
>

In fact, "$s +=()= /\S+/g" por extenso seria:

($c = (
        () = (/\S+/g)
    )
);
$s += $c;

Veja bem Eden, a questão que levantei não é a eficiência (quem quer algo
eficiente que faça em assembly) nem a legibilidade (<flame_warning>quem quer
algo legível que programe em Python</flame_warning>); trata-se do "There's
more than one way to do it". Assumi abertamente que os meus atalhos são
*toscos*, mas cada um postando uma gambiarrinha de estimação todos nós
aprendemos um pouco de Perl :D

P.S. - curti pacas o "$hashref = { some_key => $string =~ /(\d+)/ && $1 }"!
Tô pensando em como juntar com um "map" para fazer "micro-Getopt" ;)
-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20101005/e30ed3ae/attachment-0001.html>


More information about the SaoPaulo-pm mailing list