Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Operatoren

PetaPerl implementiert den vollstaendigen Satz von Perl-5-Operatoren mit identischer Semantik. Alle Operatoren wahren Perls Kontextsensitivitaet und Vorrangregeln.

Binaere Operatoren

Arithmetik

OperatorOperationBeispiel
+Addition$a + $b
-Subtraktion$a - $b
*Multiplikation$a * $b
/Division$a / $b
%Modulo$a % $b
**Potenzierung$a ** $b

Alle arithmetischen Operatoren wandeln Operanden in den numerischen Kontext um. Division durch Null erzeugt eine Warnung und gibt Unendlich oder NaN zurueck.

my $x = 5 + 3;        # 8
my $y = 10 / 3;       # 3.333...
my $z = 2 ** 10;      # 1024
my $m = 17 % 5;       # 2

Zeichenketten

OperatorOperationBeispiel
.Verkettung$a . $b
xWiederholung$str x $count

Zeichenkettenoperatoren wandeln Operanden in den Zeichenkettenkontext um.

my $str = "Hello" . " " . "World";  # "Hello World"
my $rep = "X" x 5;                   # "XXXXX"
my $pad = " " x 10;                  # 10 Leerzeichen

Numerischer Vergleich

OperatorOperationGibt zurueck
==GleichWahr bei Gleichheit
!=UngleichWahr bei Ungleichheit
<Kleiner alsWahr wenn kleiner
>Groesser alsWahr wenn groesser
<=Kleiner oder gleichWahr wenn kleiner oder gleich
>=Groesser oder gleichWahr wenn groesser oder gleich
<=>Dreiwegevergleich-1, 0 oder 1

Numerische Vergleiche wandeln Operanden in Zahlen um.

if ($age >= 18) { ... }
my $cmp = $a <=> $b;  # -1 wenn $a < $b, 0 bei Gleichheit, 1 wenn $a > $b

Zeichenkettenvergleich

OperatorOperationGibt zurueck
eqGleichWahr bei Gleichheit
neUngleichWahr bei Ungleichheit
ltKleiner alsWahr wenn kleiner
gtGroesser alsWahr wenn groesser
leKleiner oder gleichWahr wenn kleiner oder gleich
geGroesser oder gleichWahr wenn groesser oder gleich
cmpDreiwegevergleich-1, 0 oder 1

Zeichenkettenvergleiche verwenden lexikographische (Woerterbuch-)Ordnung.

if ($name eq "John") { ... }
my $cmp = $a cmp $b;  # -1, 0 oder 1

Logisch

OperatorOperationKurzschlussVorrang
&&UndJaHoch
``Oder
//Definiert-oderJaHoch
andUndJaNiedrig
orOderJaNiedrig
xorExklusiv-oderNeinNiedrig

Logische Operatoren geben den zuletzt ausgewerteten Wert zurueck, nicht nur wahr/falsch.

my $result = $x && $y;         # Gibt $y zurueck wenn $x wahr, sonst $x
my $default = $user || "guest"; # Gibt "guest" zurueck wenn $user falsch
my $value = $config // 0;      # Gibt 0 zurueck nur wenn $config undefiniert

Definiert-oder (//): Anders als || prueft dieser Operator nur, ob die linke Seite definiert ist, nicht ob sie wahr ist. 0 und "" sind beide falsch, aber definiert.

my $x = 0;
my $a = $x || 10;   # 10 (0 ist falsch)
my $b = $x // 10;   # 0 (0 ist definiert)

Bitweise

OperatorOperationBeispiel
&Bitweises UND$a & $b
``Bitweises ODER
^Bitweises XOR$a ^ $b
<<Linksverschiebung$a << $n
>>Rechtsverschiebung$a >> $n

Bitweise Operatoren arbeiten auf Ganzzahlen. Operanden werden in vorzeichenlose Ganzzahlen umgewandelt.

my $mask = 0xFF & $value;
my $flags = $READ | $WRITE;
my $double = $x << 1;

Bereich

OperatorOperationKontext
..Inklusiver BereichErzeugt im Listenkontext eine Liste
...Flip-FlopIst im skalaren Kontext zustandsbehaftet
my @digits = (0..9);              # (0, 1, 2, ..., 9)
my @letters = ('a'..'z');         # ('a', 'b', ..., 'z')
for my $i (1..100) { ... }       # Schleife von 1 bis 100

Im skalaren Kontext sind .. und ... Flip-Flop-Operatoren (zustandsbehafteter boolescher Bereich).

Bindung

OperatorOperationBeispiel
=~Abgleich$str =~ /pattern/
!~Negativer Abgleich$str !~ /pattern/

Bindungsoperatoren verbinden Zeichenketten mit Regex-Operationen.

if ($email =~ /\@/) { ... }       # Enthaelt @
if ($name !~ /^\d/) { ... }       # Beginnt nicht mit Ziffer

Unaere Operatoren

Arithmetik

OperatorOperationBeispiel
-Negation-$x
+Unaeres Plus+$x
my $neg = -5;
my $pos = +$x;  # Numerischer Kontext

Logisch

OperatorOperationBeispiel
!Nicht!$x
notNicht (niedriger Vorrang)not $x
if (!$error) { ... }
die "Fehlgeschlagen" if not $ok;

Bitweise

OperatorOperationBeispiel
~Bitweises Komplement~$x
my $inverted = ~$bits;

Referenz

OperatorOperationBeispiel
\Referenz erzeugen\$x, \@arr, \%hash
my $scalar_ref = \$value;
my $array_ref = \@data;
my $hash_ref = \%config;

Inkrement/Dekrement

OperatorOperationWann ausgewertet
++$xPraeinkrementNach dem Erhoehen
--$xPraedekrementNach dem Verringern
$x++PostinkrementVor dem Erhoehen
$x--PostdekrementVor dem Verringern
my $x = 5;
my $a = ++$x;  # $x ist 6, $a ist 6
my $b = $x++;  # $x ist 7, $b ist 6

Zeichenketteninkrement: ++ auf Zeichenketten fuehrt ein “magisches Inkrement” durch (Perl-Stil).

my $s = "aa";
$s++;  # "ab"
$s++;  # "ac"

Dateitestoperatoren

Dateitestoperatoren pruefen Eigenschaften von Dateien und Dateihandles. Alle geben wahr/falsch zurueck, ausser -s, das die Dateigroesse liefert.

OperatorTestGibt zurueck
-eExistiertBoolesch
-rLesbarBoolesch
-wSchreibbarBoolesch
-xAusfuehrbarBoolesch
-oGehoert effektiver UIDBoolesch
-RLesbar fuer reale UIDBoolesch
-WSchreibbar fuer reale UIDBoolesch
-XAusfuehrbar fuer reale UIDBoolesch
-OGehoert realer UIDBoolesch
-zGroesse NullBoolesch
-sGroesse ungleich NullGroesse in Bytes oder falsch
-fRegulaere DateiBoolesch
-dVerzeichnisBoolesch
-lSymbolischer LinkBoolesch
-pBenannte Pipe (FIFO)Boolesch
-SSocketBoolesch
-bBlockspezialdateiBoolesch
-cZeichenspezialdateiBoolesch
-tTTY (Terminal)Boolesch
-uSetuid-Bit gesetztBoolesch
-gSetgid-Bit gesetztBoolesch
-kSticky-Bit gesetztBoolesch
-TTextdateiBoolesch
-BBinaerdateiBoolesch
-MAenderungszeit (Tage)Zahl
-AZugriffszeit (Tage)Zahl
-CInode-Aenderungszeit (Tage)Zahl
if (-e $file) { ... }               # Datei existiert
if (-f $path && -r $path) { ... }   # Regulaere Datei und lesbar
my $size = -s $file;                # Groesse in Bytes
if (-d $path) { ... }               # Ist Verzeichnis

Gestapelte Dateitests: -f -w -r $file prueft alle drei Bedingungen.

Weitere unaere Operatoren

OperatorOperationBeispiel
definedAuf Definiertheit pruefendefined $x
if (defined $value) { ... }

Zuweisungsoperatoren

Einfache Zuweisung

OperatorOperationBeispiel
=Zuweisung$x = 5
my $x = 10;
my ($a, $b, $c) = (1, 2, 3);  # Listenzuweisung

Zusammengesetzte Zuweisung

Alle binaeren Operatoren haben zusammengesetzte Zuweisungsformen:

OperatorAequivalentBeispiel
+=$x = $x + $y$x += 5
-=$x = $x - $y$x -= 3
*=$x = $x * $y$x *= 2
/=$x = $x / $y$x /= 10
%=$x = $x % $y$x %= 7
**=$x = $x ** $y$x **= 2
.=$x = $x . $y$str .= "more"
x=$x = $x x $y$str x= 3
&=$x = $x & $y$bits &= $mask
`=``$x = $x
^=$x = $x ^ $y$x ^= $y
<<=$x = $x << $y$x <<= 2
>>=$x = $x >> $y$x >>= 1
&&=$x = $x && $y$x &&= $default
`=`
//=$x = $x // $y$x //= 0
my $count = 10;
$count += 5;        # 15
$count *= 2;        # 30

my $path = "/home";
$path .= "/user";   # "/home/user"

$cache ||= load_data();   # Nur laden wenn $cache falsch ist
$config //= {};           # Nur zuweisen wenn $config undef ist

Ternaerer Operator

OperatorSyntaxBeispiel
? :Bedingung$cond ? $then : $else
my $result = $x > 0 ? "positiv" : "nicht positiv";
my $max = $a > $b ? $a : $b;

Ternaerer Operator als Lvalue: Der ternaere Operator kann als Zuweisungsziel verwendet werden.

($x > 0 ? $pos : $neg) = 10;  # Weist $pos oder $neg zu

Array-/Hash-Indizes

SyntaxOperationBeispiel
$arr[index]Array-Elementzugriff$arr[0]
$hash{key}Hash-Elementzugriff$hash{name}
@arr[indices]Array-Scheibe@arr[1, 3, 5]
@hash{keys}Hash-Scheibe@hash{qw(a b c)}
my $first = $arr[0];
my $value = $hash{key};
my @subset = @arr[0, 2, 4];       # Elemente 0, 2, 4
my @values = @hash{'a', 'b'};     # Werte fuer Schluessel 'a', 'b'

Pfeiloperator

SyntaxOperationBeispiel
->[]Array-Dereferenzierungsindex$aref->[0]
->{}Hash-Dereferenzierungsindex$href->{key}
->()Methodenaufruf$obj->method()
my $element = $array_ref->[5];
my $value = $hash_ref->{name};
my $result = $object->method(@args);

Kommaoperatoren

OperatorOperationVerwendung
,Listentrennzeichen(1, 2, 3)
=>Fettes Kommakey => value

Das fette Komma (=>) quotiert Barewords auf seiner linken Seite automatisch.

my %hash = (
    name => "John",     # 'name' wird automatisch quotiert
    age => 30,
);

Operatorvorrang

Hoechster bis niedrigster Vorrang (identisch zu Perl 5):

  1. Terme und Listenoperatoren (links)
  2. -> (links)
  3. ++ -- (kein)
  4. ** (rechts)
  5. ! ~ \ unaeres + unaeres - (rechts)
  6. =~ !~ (links)
  7. * / % x (links)
  8. + - . (links)
  9. << >> (links)
  10. Benannte unaere Operatoren
  11. < > <= >= lt gt le ge (kein)
  12. == != <=> eq ne cmp ~~ (kein) – ~~ Smart Match ist teilweise implementiert
  13. & (links)
  14. | ^ (links)
  15. && (links)
  16. || // (links)
  17. .. ... (kein)
  18. ?: (rechts)
  19. = += -= usw. (rechts)
  20. , => (links)
  21. Listenoperatoren (rechts)
  22. not (rechts)
  23. and (links)
  24. or xor (links)

Verwende Klammern, wenn der Vorrang unklar ist.

PetaPerl-spezifische Hinweise

Parallelisierung

Operatoren werden standardmaessig sequenziell ausgefuehrt. PetaPerls Parallelisierung greift auf Ebene von Schleifen/map/grep, nicht bei einzelnen Operatoren.

Leistung

  • Bitweise Operationen werden zu nativen Maschinenbefehlen kompiliert
  • Zeichenkettenverkettung kann neuen Speicher allokieren (.= fuer Effizienz verwenden)
  • Numerische Operationen werden getrennt fuer Ganzzahlen und Gleitkommazahlen optimiert