/ / Warum erzeugt das Verknüpfen von Arrays in Perl Zahlen? - Arrays, Perl, Verkettung

Warum erzeugt das Verknüpfen von Arrays in Perl Zahlen? - Arrays, Perl, Verkettung

Ich habe gerade versucht, Arrays in Perl mit dem zu verketten + Betreiber und bekam seltsame Ergebnisse:

perl -wE "say([1, 2, 3] + [4, 5, 6])"
73464360

Das Gleiche mit Hashes zu tun, scheint ein Syntaxfehler zu sein:

perl -wE "say({} + {})"
syntax error at -e line 1, near "} +"
Execution of -e aborted due to compilation errors.

Was ist das Ergebnis des ersten Ausdrucks? Ist es irgendwo dokumentiert?

Antworten:

7 für die Antwort № 1

Aus der Nummerierung der Referenzen ergibt sich die Speicheradresse der Referenz.

perl -E "say @a; say 0+@a; printf "%xn",0+@a"

Typische Ausgabe (obwohl sie sich jedes Mal ändern kann, wenn Sie das Programm ausführen)

ARRAY(0x1470518)
21431576
1470518      <--- same number as in first line

Ihr Hash-Referenzbeispiel funktioniert fast, aber es scheint, dass Perl den ersten Satz analysiert {} Blöcke als Code-Block und nicht als Hash-Referenz. Wenn Sie ein unäres verwenden + und erzwingt Perl, um es als eine Hash-Referenz zu behandeln, wird es funktionieren. Ich meine Arbeit".

perl -E "say(+{} + {})"
40007168

3 für die Antwort № 2

weil + in Perl ist nur ein arithmetischer Operator. Es zwingt seine Argumente, als Zahlen interpretiert zu werden, egal was passiert. Deshalb hat Perl einen separaten Operator für die Stringverkettung (.).

Was Sie tun, ist effektiv, die Adressen hinzuzufügen, wo die Arrays gespeichert sind.

Array-Verkettung wird durch einfaches Auflisten der Arrays nacheinander erreicht. Wenn Sie jedoch Verweise auf Arrays verwenden ([...]), dann musst du sie zuerst mit dereferenzieren @{...}:

perl -wE "say( @{[1,2,3]}, @{[4,5,6]} )"

Normalerweise würden Sie jedoch Array-Variablen verwenden und benötigen keine zusätzliche Syntax.

perl -wE "my @a = (1,2,3); my @b = (4,5,6); say join("-",@a,@b)"
#=> 1-2-3-4-5-6

Das Gleiche gilt für Hashes; my %c = (%a,%b); wird den Inhalt von kombinieren %a und %b (in dieser Reihenfolge, so dass %b"s Wert für alle gängigen Schlüssel wird überschrieben %a"s) in den neuen Hash %c. Du könntest benutzen my $c = { %$a, %$b }; dasselbe mit Referenzen tun. Ein Gotcha, in den du hineinrennst + Versuch, ist das {} kann als ein leerer Code-Block anstelle eines leeren Hash-Codes interpretiert werden.