map und grep sind leistungsstarke Funktionen in Perl zur Arbeit mit Arrays:
my @nums = (1, 2, 3, 4, 5, 6); my @squared = map { $_ * $_ } @nums; # (1, 4, 9, 16, 25, 36) my @even = grep { $_ % 2 == 0 } @nums; # (2, 4, 6)
map und grep enthält die Variable $_ standardmäßig das aktuelle Element. Eine Modifikation von $_ verändert das Element des ursprünglichen Arrays, wenn das Array per Referenz übergeben wurde oder $_ explizit verwendet wird (z. B. durch Alias über foreach).map gibt immer eine Liste zurück, grep gibt ein Teilmengen des ursprünglichen Arrays zurück.Frage: Was macht der folgende Code und warum?
my @nums = (1..5); my @result = map { $_++ } @nums; print "@nums ";
Antwort: Dieser Code wird das ursprüngliche Array @nums nicht ändern. Der Operator $_++ erhöht den Wert der Variable innerhalb des Blocks, speichert diese Änderungen jedoch nicht im ursprünglichen Array, da map den geänderten Wert zurückgibt, das ursprüngliche Array jedoch unberührt bleibt (es sei denn, es wird ein Alias über foreach verwendet).
my @nums = (1..5); my @result = map { $_++ } @nums; # @result wird (1,2,3,4,5), @nums bleibt unverändert print "@nums "; # Gibt aus: 1 2 3 4 5
Geschichte In einem Projekt erwartete ein Entwickler, dass nach
map { $_++ } @arraydas Array@arraygeändert werden würde. Infolgedessen arbeitete das Programm weiterhin mit alten Werten, was zu falschen Berechnungen bei der Datenaggregation führte.
Geschichte In einem Berichtssystem wurden bei der Filterung eines Arrays über
grepversehentlich der Zuweisungsbefehl$result = $_innerhalb des Blocks verwendet, wodurch alle Elemente in dasselbe Variable überschrieben wurden und die Quelle der Daten verloren ging. Dies erschwerte das Debugging und führte zu Verlusten in der Berichterstattung.
Geschichte In einem Integrationsskript wurden verschachtelte
mapverwendet und es wurde vergessen, dass der innere Kontext auch mit der gemeinsamen Variable$_arbeitet, was zu unvorhersehbarem Verhalten bei der Modifikation der Elemente führte, da die inneremapdie Werte im Ergebnisarray überschreibt.