Übersicht ||
0:Vor |
1:Ge |
2:Theo |
3:Var |
4:Op |
5:IO |
6:{} |
7:Sub |
8:OOP |
9:Rx ||
A:Index |
B:Tab |
C: Tour |
D:Delta |
E:Links
Diese Tour soll Appetit auf Perl6 machen. Dazu stellen ich jedesmal links ein Stück Perl5-Code neben ein funktionsgleiches Stück Perl6-Code rechts, um die besten Veränderungen der Sprache selbsterklärend herauszustellen.
Perl 5 Perl 6
======== ========
Kommandozeile
print "bananas are good\n"; say "bananas are good";
print "und ich sagte: ".$zitate{\"mir\"}.".\n"; say "und ich sagte: %zitate{"mir"}.";
print "und ich sagte: ".$zitate{\"mir\"}.".\n"; say "und ich sagte: %zitate<mir>.";
print "Was ist ... "; $ergebnis = prompt "Was ist ... ";
chomp($ergebnis = <STDIN>);
Datei IO
$inhalt = do { local $/; $inhalt = slurp "gedichte.txt";
open my $FH, "poetry.txt"; <$FH>
};
chomp(@inhalt = do { @inhalt = lines "gedichte.txt";
open my $FH, "poetry.txt"; <$FH>
});
Gab es bisher nur mit "use File::Slurp".
paralleles rechnen
$summe += $_ for @zahlen; $summe = [+] @zahlen;
for (0..$#faktor1){ @produkt = @faktor1 >>*<< @faktor2;
$produkt[$_] = $faktor1[$_] * $faktor2[$_];
}
Der Perl5code ist eine Vereinfachung, natürlich tut Perl6 "das Richtige" wenn die Arrays unterschiedlich lang sind.
Vergleiche
if ($a == 3 or $a == 4 or $a == 7) {} if $a == 3|4|7 {}
if (4 < $a and $a < 12) {} if 4 < $a < 12 {}
if (4 < $a and $a <= 12) {} if $a ~~ 4^..12 {}
$a = defined $b ? $b : $c; $a = $b // $c;
Das waren Junctions, dann verkettete (chained) Vergleichsoperatoren und der defined-OR Operator.
Caseanweisung
given $a {
if ($a = 2 or $a = 5) {} when 2 | 5 {...}
elseif ($a = 6 or $a = 7 or $a = 8 or $a = 9) {} when 6..9 {...}
elseif ($a=~/g/) {} when 'g' {...}
else {} default {...}
}
es ist klarer zu lesen sehr vielseitig und grad in Verbindung mit junctions noch übersichtlicher.
mächtige for Schleifen
for my $i (1..15) {} for 1..15 -> $i {...}
for (my $i=15; $i>1; $i-=2) {} for 15,*-2...1 -> $i {...}
for my $key (keys %hash) { for %hash.kv -> $key, $value {
print "$key => $hash{$key}\n" say "$key => $value"
} }
for my $i (0..$#a) { for zip(@a; @b; @c) -> $a, $b, $c {...}
my $a = @a[$i];
my $b = @b[$i];
my $c = @c[$i];
}
benannte Parameter in Subroutinen
sub routine { sub routine ($a, $b, *@rest) {...}
my $a = shift;
my $b = shift;
my @rest = @_;
}
Alle Variablen in Signatur sind automatisch lexikalisch wie mit
my deklariert.
Objekte mit autogenerierten new, gettern und settern:
package Heart::Gold; class Heart::Gold {
has $.speed;
sub new { method stop { $speed = 0 }
bless {speed => 0 }, shift; }
}
my Heart::Gold $hg1 .= new;
sub speed { $hg1.speed = 100;
my $self = shift; my $hg2 = $hg1.clone;
my $speed = shift;
if ($speed) { $self->{speed} = $speed }
else { $self->{speed} }
}
sub stop {
my $self = shift;
$self->{speed} = 0;
}
getter, setter, new und clone Methoden werden autogeneriert.
Übersicht ||
0:Vor |
1:Ge |
2:Theo |
3:Var |
4:Op |
5:IO |
6:{} |
7:Sub |
8:OOP |
9:Rx ||
A:Index |
B: Tab |
C: Tour |
D:Delta |
E:Links
--
HerbertBreunung - 03 May 2006