Larry Wall, criador do
Perl e cocriador do
Parrot, declarou que
a versão 6 de Perl não será compatível com as versões anteriores.
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