In Perl hängt das Ergebnis der Zuweisung (und damit die Arbeit mit Arrays und Hashes) vom Kontext ab.
my @arr = (10, 20, 30); my $count = @arr; # $count == 3 my ($first, $second) = @arr; # $first == 10, $second == 20
Für Hashes:
my %h = (a=>1, b=>2, c=>3); my $size = %h; # $size == 3 in modernen Perl-Versionen, aber früher war das nicht so!
Achten Sie darauf, eine gesamte Referenz auf ein Array zuzuweisen, anstatt den Inhalt zu kopieren!
Worin besteht der Unterschied zwischen der Zuweisung eines Arrays an eine Referenz und der Kopie des Inhalts eines Arrays?
Antwort:
my @a = (1,2,3); my $ref = \@a; # $ref ist eine Referenz auf das Array, Änderungen über $ref sind in @a sichtbar my @b = @a; # @b ist ein neues Array, Änderungen in @b haben keinen Einfluss auf @a # Vergleichen Sie: push @$ref, 4; # @a ist jetzt (1,2,3,4) push @b, 5; # @a bleibt (1,2,3,4); @b ist (1,2,3,5)
Geschichte 1
Im Projekt wurde ein Array über eine Referenz an eine Unterroutine übergeben, ohne zu verstehen, dass es sich um eine Referenz handelt: die Funktion änderte es an der Stelle des Aufrufs. Es kamen Bugs — die Datenstruktur im aufrufenden Code war bereits "beschädigt". Wir erwarteten eine Kopie, erhielten aber einen Alias.
Geschichte 2
Ein Ingenieur ging davon aus, dass die Skalarzuweisung von
%hdie tatsächliche Anzahl der Paare zurückgibt. Es stellte sich heraus — in alten Perl-Versionen war dieses Verhalten anders: es wurde die Anzahl der Slots/Buckets, nicht die Länge zurückgegeben! Infolgedessen wurde manchmal nicht 3, sondern eine andere Zahl zurückgegeben, was die Statistik kaputt machte.
Geschichte 3
In einem großen ETL-System wurden Arrays über Referenzen kopiert, und dann überschrieben sie sich unerwartet gegenseitig, weil alle mit demselben Array arbeiteten und nicht mit unabhängigen Kopien. Die Diagnose des Fehlers dauerte mehrere Tage.