Paulo Henrique Rodrigues Pinheiro

Um blog sobre programação para programadores!


Brincando com Perl6

Neste artigo será comentado um pequeno texto publicado em http://blogs.perl.org.

O texto original

O texto que me fez abrir um terminal e testar formas alternativas do que estava nele, foi esse: Tiny Games with Perl, de Curtis Poe.

O código que ele apresenta é simples, e muito animador para a adoção do Perl6:


$ perl6 -e 'for ^6 { say ("⚀".."⚅").roll(3) }'
⚄ ⚀ ⚂
⚁ ⚁ ⚄
⚃ ⚄ ⚂
⚁ ⚅ ⚀
⚀ ⚁ ⚀
⚀ ⚀ ⚂

Sinceramente, não entendi nada e então mudei os números pra ver o que dava:


$ perl6 -e 'for ^8 { say ("⚀".."⚅").roll(5) }'
⚄ ⚀ ⚀ ⚂ ⚀
⚄ ⚃ ⚃ ⚀ ⚃
⚅ ⚃ ⚅ ⚂ ⚀
⚅ ⚅ ⚄ ⚂ ⚀
⚁ ⚅ ⚁ ⚁ ⚃
⚁ ⚄ ⚀ ⚃ ⚅
⚃ ⚂ ⚂ ⚄ ⚀
⚀ ⚅ ⚁ ⚁ ⚁

Opa, será que é isso mesmo? aí decidi entrar no shell pra brincar:


$ perl6
> for ^3 { say ("A".."Z").roll(5) }
B Q W R X
Z I K F Y
Q U I O X
> for ^3 { say ("A".."Z").roll(5) }
X Q I E E
D J I Q W
S C V U V
> for ^3 { say ("A".."Z").roll(5) }
A H L T I
P U L F Q
C R H D J

Vamos aumentar os possíveis caracteres:


> for ^3 { say ("A".."z").roll(5) }
p ` x d v
J E a W j
e z e ` U
> for ^3 { say ("A".."z").roll(5) }
F p a ` H
] u Z v z
u u ` i a
> for ^3 { say ("A".."z").roll(5) }
c b i g H
w E E d o
w s Z K s

Então temos um gerador de senhas aleatório. Como gerar uma senha? Minhas tentativas:


> say ("A".."z").roll(8)
W V h U b s I V

Não gostei desses espaços entre os caracteres, pois não dá pra copiar e colar. Mais uma tentativa:


> print ("A".."z").roll(8)
pSobmquY>

Continua ainda muito chato, tem que marcar com cuidado pra copiar "no mouse". Vamos adicionar uma quebra de linha:


> print ("A".."z").roll(8) . "\n"
===SORRY!=== Error while compiling <unknown file>
Unsupported use of . to concatenate strings; in Perl 6 please use ~
at <unknown file>:1
------> print ("A".."z").roll(8) . ⏏"\n"

Ainda por cima, nos ajuda a fazer a coisa certa. Vejamos:


> print ("A".."z").roll(8) ~ "\n"
y N a ^ z a s R
> say( ("A".."z").roll(8)) ~ "\n"
_ n l E c L I u

Mas voltaram os velhos espaços entre os caracteres. Aí lembrei do velho truque, e vi que nesse artigo ele usa join:


> say join '',("A".."z").roll(8)
yWxhTCLt

Ou então, em uma linha executável:


$ perl6 -e 'say join "",("A".."z").roll(8)'
AgHY[Yuu

Leia mais:

Documentação do Perl6 Sobre o roll Operador ^