Christian Kruse: Rest Operator und Spread Operator

Beitrag lesen

Hallo Tabellenkalk,

Laut Wiki wäre das aber "..", also nur zwei.

Perl hat zwei Range-Operatoren, .. und .... Den Unterschied sieht man aber erst, wenn man die Range in einem Skalar-Kontext betrachtet: dort wird sie zu einem boolschen Wert.

Die Semantik einer Range in Perl in einem Skalar-Kontext ist ziemlich kompliziert. Im wesentlichen handelt es sich um ein Flipflop. Betrachten wir einmal diesen Ausdruck:

if($left .. $right) {
  #...
}

Die Bedingung evaluiert solange false bis der linke Operand wahr wird. Dann wird der linke Operand ignoriert und evaluiert solange zu true, bis der rechte Operand zu true evaluiert: dann wird der Ausdruck false. So kann man den Wert dieses Ausdrucks hin- und herschalten, wie bei einem Flipflop. Mal ein Beispiel, wo man so etwas einsetzen könnte: ich möchte in einem Text alles zwischen den Zeilen foo und bar haben:

while (<DATA>) {
  print if /foo/ .. /bar/;
}

__DATA__
blub
foo
Zeile 1
Zeile 2
Zeile 3
bar
blub
blub
foo
Zeile 4
Zeile 5
bar
blub
blub

Die Ausgabe dieses Programms ist:

foo
Zeile 1
Zeile 2
Zeile 3
bar
foo
Zeile 4
Zeile 5
bar

Setzen wir jetzt den Operator ... ein, dann wird der rechte Operand nicht mehr geprüft wenn der linke wahr ist. Das führt in unserem Beispiel dazu, dass Zeilen, bei denen sowohl foo als auch bar vorkommen nicht als beendet markiert werden:

while (<DATA>) {
  print if /foo/ ... /bar/;
}

__DATA__
blub
foo
Zeile 1
Zeile 2
Zeile 3
bar
blub
blub
foo
Zeile 4
Zeile 5
bar
foo bar
blub
blub

Als Ausgabe gibt das:

foo
Zeile 1
Zeile 2
Zeile 3
bar
foo
Zeile 4
Zeile 5
bar
foo bar
blub
blub

Beachte die beiden blub am Ende.

Diese komplizierte Semantik ist sicher noch ein Grund, warum Perl als Write-Only Language veschriehen wird ;-)

LG,
CK