Realmente dei uma olhada no Perl6 e está muito diferente… só que para melhor. =)
A única coisa de que não gostei foram das mudanças em expressões regulares, no mais as mudanças só acrescentam.
Tipagem
Uma das maiores reclamações que os programadores fazem de Perl é sua tipagem insanamente fraca, apenas três tipos: escalar (
$
scalar), vetor (@
array) e vetor associativo (%
hash).Perl6 traz o suporte a tipos! Pelo que vi na documentação, há seis tipos novos: inteiro (
int
), ponto flutuante (num
), string (str
), booleano (bool
), bit (bit
) e referência (ref
), de forma estática:my int $foo = 5;
my str $bar = "foo";
my num $baz = 5.3;
my bool $foobar = 1;
Conversão:
print str 5;
print scalar @list;
Passagem de parâmetros
Em Perl a passagem de parâmetros sempre foi por cópia, agora passa a ser por referência, exceto para tipos primitivos.
No caso de atribuição de referência de tipos primitivos, em vez do tradicional:
my $b = \$a;
Passa a ser:
my $b := $a;
Mudanças em vetores
A criação de vetor passa a suportar um formato mais simples.
Temos o tradicional:
my @fruits = ("apple", "pear", "banana");
Que passa a ser:
my @fruits = "apple", "pear", "banana";
E a lista:
my @fruits = qw/apple pear banana/;
Passa a ser:
my @fruits = <apple pear banana>;
Em Perl5, para se obter um item de um vetor, o primeiro carácter mudava de
@
para $
: $fruits[0]
. Agora, em Perl6, não há mais alteração: @fruits[0]
.A quantidade de elementos de um vetor era dada por:
my $count = $#fruits + 1;
Agora, em Perl6 passa a ser:
my int $count = @fruits.elems;
Repara que o famigerado
->
virou um simples ponto!Também para obter o último elemento do vetor, que era:
my $last = $fruit[$#fruit];
Passa a ser:
my $last = @fruit[@fruit.end];
Ou ainda:
my $last = @fruit[*-1];
Para se obter um vetor em um contexto string, Perl6 oferece o atalho
~
. Para numérico +
e para booleano ?
:my str $str_fruits = ~@fruits;
my num $num_fruits = +@fruits;
my bool $bool_fruits = ?@fruits;
Tratamento de exceções
Em Perl5 era usado
eval
para avaliar um bloco com possível exceção e $@
recebia os dados de exceção:eval {
…
};
if ($@) {
warn "exception: $@";
}
Perl6 passa a usar
try
-CATCH
:try {
…
CATCH {
warn "exception: $!";
}
}
Repare que a mensagem de exceção passa a ser capturada em
$!
e o bloco CATCH
fica dentro do bloco try
.Repetições
Não há uma forma menos dolorosa de dizer isso:
foreach
vira for
, que também passa a suportar algumas construções de while
, for
vira loop
, que também passa a suportar algumas construções de while
.Então:
foreach (@fruits) {
Vira:
for @fruits {
E:
foreach my $fruit (@fruits) {
Vira:
for @fruits -> $fruit {
Agora, olha o
while
aí:while (my($age, $sex, $location) = splice @whatever, 0, 3) {
Vira:
for @whatever -> $age, $sex, $location {
Contando até dez em Perl5:
for (my $i = 1; $i <=10; $i++) {
print "$i\n";
}
Contando até dez em Perl6:
loop (my $i = 1; $i <=10; $i++) {
say $i;
}
E
loop { … }
funciona como while (1) { … }
.Vetor associativo
Sofre alterações parecidas com as de vetor.
Por exemplo, em Perl5:
my $c = $days{February};
Em Perl6 vira:
my int $c = %days{'February'};
Ou ainda:
my int $c = %days<February>;
Alguns métodos
Para se obter o tamanho de uma string em Perl5:
my $len = length $string;
Em Perl6 fica:
my int $len = $string.chars;
Para exibir um vetor de modo ordenado em Perl5:
print sort(@fruits);
Em Perl6:
say @array.sort;
Ou ainda:
@array.sort.print;
Variáveis de sistema
Para se obter o valor da variável
HOME
em Perl5:print $ENV{HOME};
Em Perl6 passa a ser:
print %*ENV<HOME>;
Ou ainda:
print $+HOME;
Orientação a objetos
Criar uma classe em Perl5 era uma aventura!
Você criava um pacote (
package
) e «abençoava» um escalar com o pacote… pronto: aí tinha uma instância cuja classe era o pacote.Um tremendo bacalhau.
Em Perl6 temos as palavras reservadas
class
, has
(para atributos) e method
(para métodos), para criar classes reais.Métodos privados precisam começar com
!
, por exemplo, $!age
, e métodos públicos precisam começar com .
, como por exemplo $.name
.A passagem de parâmetros também mudou. Além de ser por referência, como citado, passa a suportar parâmetros nominais e parâmetros excedentes – como
*args
de Python, mas com a sintaxe *@args
.Se o argumento for mutável precisa ser seguido de
is rw
.O que era:
package Square;
@ISA = qw/ Rectangle /;
Passa a ser:
class Square is Rectangle {
E o que era:
my $rect = new Rectangle(4, 5);
Passa a ser:
my Rectangle $rect .= new(4, 5);
Conclusão
Há muito mais! Consulte a página Perl6::Perl5::Differences, mas o que já sabemos é: quem trabalha com Perl vai precisar aprender de novo!
[]'s
Cacilhas, La Batalema