ProgrammierungDateningenieur

Welche Feinheiten gibt es bei der Verwendung von Listen- und Skalarzuweisungen für Arrays und Hashes in Perl? Wie können gängige Fehler bei der Manipulation von Datenstrukturen vermieden werden?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

In Perl hängt das Ergebnis der Zuweisung (und damit die Arbeit mit Arrays und Hashes) vom Kontext ab.

  • Skalarzuweisung eines Arrays gibt die Größe des Arrays zurück.
  • Listen-Zuweisung gibt alle Elemente zurück.
my @arr = (10, 20, 30); my $count = @arr; # $count == 3 my ($first, $second) = @arr; # $first == 10, $second == 20

Für Hashes:

  • Die Zuweisung eines Hashs an eine Liste erstellt ein Schlüssel/Wert-Array.
  • Skalarzuweisung eines Hashs gibt eine falsche Darstellung zurück ("Größe des Hashs") — aber nicht einfach die Anzahl der Paare!
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!

Fangfrage

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)

Beispiele realer Fehler aufgrund von Unkenntnis der Feinheiten des Themas


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 %h die 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.