Versionen dieses Beitrags

Rest Operator und Spread Operator

O81 7123 Christian Kruse
  • Rest Operator und Spread Operator
  • Hallo 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.
  • 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

Gb 80x80 Gunnar Bittersmann
  • Rest Operator und Spread Operator
  • Hallo 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.
  • 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

Gb 80x80 Gunnar Bittersmann
  • Rest Operator und Spread Operator
  • Hallo 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.
  • 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>