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