Desde que uso o Bash, tenho uma grande tara por "one-liners"; aquelas "linhas de comando gigantescas que são programas". Como o Perl é extremamente versátil para funcionar via pipe, os meus "one-liners" gradualmente cresceram a ponto de ocuparem várias linhas, devido ao limite natural da largura da tela :)<br>
Seguem alguns snippets da minha "coleção":<br><br><br><code></code>perl '-F/\s+/' -lane '$s += $F[9] }{ print $s"' access.log<br><br>Imprime a somatória dos tamanhos dos responses HTTP (10-a coluna no formato CLF do Apache). O atalho é o "}{", que fecha o bloco "while(<>){...}" aberto pelo parâmetro "-n". Por extenso, o equivalente seria:<br>
perl -le 'while (<>) { @F = split /\s+/; $s += $F[9] }; print "$s' access.log<br>
<br><br>perl -e '$x = 10; while ($x) { $x= ~-$x; print "$x\n" }'<br><br>Código alternativo para contagens regressivas.<br>"~-$x" decrementa $x desde que $x seja diferente de 0. Por extenso, seria "(~(-$x))".<br>
<br><br>perl -le 'print ~~localtime'<br><br>"~~" 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'.<br>
<br><br>perl -lne '$s+ =()= /\S+/g }{ print $s'<br><br>"=()=", 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 :/<br>
<br><br>perl -le '$x = 12345; $y = 67890; ($x!=$y)&&($x^=$y^=$x^=$y); print "$x $y"'<br>BÔNUS! Isso em particular não tem utilidade nenhuma, mas é, no mínimo, curioso. Serve para dar um "swap" de valores (NUMÉRICOS!) das variáveis, ou seja, é equivalente a "$tmp = $y; $y = $x; $x = $tmp;"<br>
<br><br>Alguém mais teria alguma idiossincrasia para compartilhar? :) <br><br>