Rest Operator und Spread Operator
bearbeitet von Christian KruseHallo Tabellenkalk,
> Laut [Wiki](http://wiki.selfhtml.org/wiki/Perl/Listen_bzw._Arrays) 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:
~~~ perl
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:
~~~ perl
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:
~~~ perl
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
--
<https://wwwtech.de/about>
Rest Operator und Spread Operator
bearbeitet von Gunnar BittersmannHallo Tabellenkalk,
> Laut [Wiki](http://wiki.selfhtml.org/wiki/Perl/Listen_bzw._Arrays) 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:
~~~ perl
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:
~~~ perl
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:
~~~ perl
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
--
<https://wwwtech.de/about>
Rest Operator und Spread Operator
bearbeitet von Gunnar BittersmannHallo Tabellenkalk,
> Laut [Wiki](http://wiki.selfhtml.org/wiki/Perl/Listen_bzw._Arrays) 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:
~~~ perl
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:
~~~ perl
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:
~~~ perl
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
--
<https://wwwtech.de/about>