Frage

Was ist der Unterschied zwischen den skalaren und Listen Kontexten in Perl und hat dies eine parallel in anderen Sprachen wie Java oder Javascript?

War es hilfreich?

Lösung

Verschiedene Operatoren in Perl sind kontextsensitiv und zu unterschiedlichen Ergebnissen führen in der Liste und Skalarkontext.

Zum Beispiel:

my(@array) = (1, 2, 4, 8, 16);
my($first) = @array;
my(@copy1) = @array;
my @copy2  = @array;
my $count  = @array;

print "array: @array\n";
print "first: $first\n";
print "copy1: @copy1\n";
print "copy2: @copy2\n";
print "count: $count\n";

Ausgabe:

array: 1 2 4 8 16
first: 1
copy1: 1 2 4 8 16
copy2: 1 2 4 8 16
count: 5

  • $first enthält 1 (das erste Element des Arrays), da die Klammern in der my($first) einen Array Kontext bereitzustellen, aber es gibt nur Platz für einen Wert in $first.
  • beide @copy1 und @copy2 enthalten eine Kopie @array,
  • und $count 5 enthalten, weil es ein Skalarkontext ist, und @array auswertet auf die Anzahl der Elemente in dem Array in Skalarkontext.

Ausführlichere Beispiele zu konstruiert werden könnten (die Ergebnisse sind eine Übung für den Leser):

my($item1, $item2, @rest) = @array;
my(@copy3, @copy4) = @array, @array;

Es gibt keine direkten parallel zur Liste und Skalarkontext in anderen Sprachen, die ich kenne.

Andere Tipps

Scalar Kontext ist das, was Sie bekommen, wenn Sie sich für einen einzigen Wert suchen. Listenkontext ist, was Sie bekommen, wenn Sie für mehrere Werte suchen. Einer der häufigsten Orte, die Unterscheidung zu sehen ist, wenn sie mit Arrays arbeiten:

@x = @array;  # copy an array
$x = @array;  # get the number of elements in an array

Andere Operatoren und Funktionen sind kontextsensitiv auch:

$x   = 'abc' =~ /(\w+)/;  # $x = 1
($x) = 'abc' =~ /(\w+)/;  # $x = 'abc'
@x   = localtime();       # (seconds, minutes, hours...)
$x   = localtime();       # 'Thu Dec 18 10:02:17 2008'

Wie ein Operator (oder Funktion) in einem gegebenen Kontext verhält obliegt den Betreiber. Es gibt keine allgemeingültigen Regeln dafür, wie die Dinge sollen verhalten.

Sie können Ihre eigenen Subroutinen kontextsensitiv mit Hilfe der wantarray Funktion zur Bestimmung des anrufenden Kontext machen. Sie können einen Ausdruck zwingen, unter Verwendung des scalar Schlüsselwort in Skalarkontext ausgewertet werden.

Neben Skalare und Liste Kontexte werden Sie auch „leer“ sehen (kein Rückgabewert erwartet) und „boolean“ (a true / false Wert erwartet) Kontexte in der Dokumentation erwähnt.

Dies bedeutet einfach, dass ein Datentyp auf der Basis des Modus der Operation ausgewertet. Zum Beispiel bedeutet eine Zuordnung zu einem skalaren der rechten Seite wird als skalare ausgewertet werden.

Ich denke, das beste Mittel zur Verständigung Kontext über wantarray lernt. So vorstellen, dass = ist ein Unterprogramm, das implementiert wantarray:

sub = {
  return if ( ! defined wantarray ); # void: just return (doesn't make sense for =)
  return @_ if ( wantarray ); # list: return the array
  return $#_ + 1; # scalar: return the count of the @_
}

Die Beispiele in dieser Beitrag Arbeit, als ob das obige Unterprogramm, indem man die rechte Seite als Parameter aufgerufen wird.

Wie Parallele in anderen Sprachen, ja, ich bleibe dabei, dass praktisch jede Sprache etwas ähnliches unterstützt. Polymorphismus ist ähnlich in allen OO-Sprachen. Ein weiteres Beispiel, Java konvertiert Objekte in String in bestimmten Kontexten. Und jede untypisierten Skriptsprache ich verwendet habe, hat ähnliche Konzepte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top