Frage

Da Arrays und Hashes nur Skalare in Perl enthalten können, warum haben Sie den $ verwenden, um den Interpreter zu sagen, dass der Wert ein Skalar ist, wenn Array oder Hash-Elemente zugreifen? Mit anderen Worten, vorausgesetzt, Sie einen Array @myarray und ein Hash-%myhash haben, warum müssen Sie tun:

$x = $myarray[1];
$y = $myhash{'foo'};

statt nur dabei:

$x = myarray[1];
$y = myhash{'foo'};

Warum sind die oben zweideutig?

Wäre es nicht illegal sein, Perl-Code, wenn es alles andere als ein $ an diesem Ort war? Zum Beispiel sind nicht alle der folgenden illegal in Perl?

@var[0];
@var{'key'};
%var[0];
%var{'key'};
War es hilfreich?

Lösung

Scheiben sind nicht illegal:

@slice = @myarray[1, 2, 5];
@slice = @myhash{qw/foo bar baz/};

Und ich vermute, dass ein Teil der Grund ist, warum Sie angeben müssen, wenn Sie einen einzelnen Wert aus dem Hash / Array oder nicht erhalten möchten.

Andere Tipps

Ich habe gerade verwendet

my $x = myarray[1];

in einem Programm und zu meiner Überraschung, hier ist was passiert, wenn ich es lief:

$ perl foo.pl 
Flying Butt Monkeys!

Das ist, weil das ganze Programm sieht wie folgt aus:

$ cat foo.pl 
#!/usr/bin/env perl

use strict;
use warnings;

sub myarray {
  print "Flying Butt Monkeys!\n";
}

my $x = myarray[1];

So ruft ein Unterprogramm myarray es einen Verweis auf einen anonyme Array Hindurchleiten ein einzelnes Element enthält, 1.

Das ist ein weiterer Grund, warum Sie das Siegel auf einem Array-Zugriff benötigen.

Die Sigill Sie den Rückgabetyp des Behälters geben. Also, wenn etwas beginnt mit @, wissen Sie, dass es eine Liste zurückgibt. Wenn es mit $ beginnt, es gibt einen Skalar.

Nun, wenn es nur eine Kennung nach dem Sigil (wie $foo oder @foo ist, dann ist es eine einfache Variable Zugriff. Wenn es von einem [ gefolgt ist, ist es ein Zugriff auf ein Array ist, wenn es von einem { gefolgt ist, ist es ein Zugriff auf einen Hash.

# variables
$foo
@foo

# accesses
$stuff{blubb} # accesses %stuff, returns a scalar
@stuff{@list} # accesses %stuff, returns an array
$stuff[blubb] # accesses @stuff, returns a scalar
              # (and calls the blubb() function)
@stuff[blubb] # accesses @stuff, returns an array

Einige menschlichen Sprachen haben sehr ähnliche Konzepte.

Doch viele Programmierer festgestellt, dass verwirrend, so Perl 6 eine invariante Sigill verwendet.

Im Allgemeinen ist die Perl 5 Compiler will bei der Kompilierung wissen, ob etwas in der Liste oder im Skalarkontext ist, also ohne die führende Sigill einige Begriffe mehrdeutig werden würde.

Dies gilt Perl: @var[0]. Es ist ein Array-Slice der Länge eins. @var[0,1] wäre eine Array Scheibe Länge zwei.

@var['key'] ist nicht gültig Perl, weil Arrays können nur durch Zahlen indiziert werden, und die anderen beiden (%var[0] and %var['key']) sind Perl nicht gültig, da Hash-Scheiben die {} zum Index der Hash verwenden.

@var{'key'} und @var{0} sind beide gültigen Hash-Scheiben, though. Natürlich ist es nicht normal ist Scheiben Länge zu nehmen, aber es ist auf jeden Fall gültig.

der Scheibe Abschnitt perldata Perldoc Weitere Informationen finden Sie über in Perl schneiden.

Die Menschen haben bereits darauf hingewiesen, dass Sie Scheiben und Kontexte haben, aber sigils gibt es die Dinge zu trennen, die Variablen von alles andere sind. Sie müssen nicht alle Schlüsselwörter oder Subroutinennamen kennen einen vernünftigen Variablennamen zu wählen. Es ist eines der großen Dinge, die ich über Perl in anderen Sprachen fehlen.

kann ich von einer Art und Weise denkt, dass

$x = myarray[1];

ist nicht eindeutig - was ist, wenn Sie einen Array mit dem Namen m wollten

$x = m[1];

Wie kann man sagen, dass abgesehen von einem Regex?

Mit anderen Worten, die Syntax ist es die Perl-Interpreter zu helfen, gut, zu interpretieren!

In Perl 5 ein sigil (in Perl 6 geändert wird) gibt den Kontext des Ausdrucks.

  • Sie wollen einen bestimmten skalar aus einem Hash, so dass es $hash{key} ist.
  • Sie möchten den Wert eines bestimmten Schlitz aus einem Array, also ist es $array[0].

Wie jedoch durch Zigdon wies darauf hin, Scheiben sind legal. Sie interpretieren die diese Ausdrücke in einer Liste Kontext.

  • Sie möchten eine Liste von 1-Wert in einem Hash @hash{key} arbeitet
  • Aber auch größere Listen so gut funktionieren, wie @hash{qw<key1 key2 ... key_n>}.

  • Sie möchten ein paar Schlitze aus einem Array @array[0,3,5..7,$n..$n+5] Werke

  • @array[0] ist eine Liste der Größe 1

Es gibt keinen "Hash-Kontext", so weder %hash{@keys} noch %hash{key} Bedeutung hat.

Sie haben also "@" + "array[0]" <=> + als vollständiger Ausdruck.

Die Sigill bietet den Kontext für den Zugriff:

  • bedeutet $ Skalarkontext (eine skalare Variable oder ein einzelnes Element eines Hash oder ein Array)
  • @ bedeutet Listenkontext (eine ganze Reihe oder eine Scheibe ein Hash oder ein Array)
  • % ist eine ganze Hash

In Perl 5 müssen Sie die sigils ($ und @), da die Standardinterpretation von Bareword Kennung ist die ein Unterprogramm-Aufruf (wodurch die Notwendigkeit zu verwenden, und in den meisten Fällen).

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