Es gibt zwei Überlegungen. Die offensichtliche ist, wie groß wird Ihr Array werden? Wenn es weniger als ein paar Dutzend Elemente ist, dann ist die Größe kein Faktor (es sei denn, Sie sind Mikro-Optimierung für einige schnell aufgerufene Funktion, aber Sie müssten einige Speicher Profiling tun, um dies zuerst zu beweisen).
Das ist der einfache Teil. Die oft übersehene zweite Überlegung ist die Schnittstelle. Wie wird das zurückgegebene Array verwendet? Dies ist wichtig, weil die Dereferenzierung von ganzen Arrays in Perl ziemlich schlimm ist. Zum Beispiel:
for my $info (@{ getInfo($some, $args) }) {
...
}
Das ist hässlich. Das ist viel besser.
Es eignet sich auch zum Mapping und Greppen.
my @info = grep { ... } getInfo($some, $args);
Aber ein Array ref zurückkehren kann sehr nützlich sein, wenn Sie einzelne Elemente gehen zu herauszupicken:
my $address = (getInfo($some, $args))[2];
Oder:
my @info = getInfo($some, $args);
my $address = $info[2];
my $address = getInfo($some, $args)->[2];
, die als einfacher ist
Aber an diesem Punkt, Sie sho Uld Frage, ob @info wirklich eine Liste oder ein Hash ist.
my $address = getInfo($some, $args)->{address};
Was Sie nicht tun sollten, ist haben getInfo()
ein Array ref in Skalarkontext und ein Array im Listenkontext. Dies verwirrt die traditionelle Verwendung von skalaren Kontexten als Array-Länge, die den Benutzer überraschen wird.
Schließlich werde ich mein eigenes Modul, Method::Signatures, stecken, weil es einen Kompromiss für die Übergabe von Array-Referenzen bietet, ohne die Array-Ref-Syntax verwenden zu müssen.
use Method::Signatures;
method foo(\@args) {
print "@args"; # @args is not a copy
push @args, 42; # this alters the caller array
}
my @nums = (1,2,3);
Class->foo(\@nums); # prints 1 2 3
print "@nums"; # prints 1 2 3 42
Dies geschieht durch die Magie von Data::Alias.
Vielleicht könnten Sie auf einer höheren Ebene erklären, was Sie zu tun versuchen. Vielleicht gibt es eine modernere, Perlianische Art zu schreiben, was Sie wollen, um Ihr Problem zu vermeiden. Oder machen Sie zumindest Ihre Absichten klarer. –
@unknown (google): Ich mache das oft in verschiedenen Kontexten. Das letzte Mal war, als ich eine Datei in ein Array lesen wollte. Also muss die Datei geöffnet werden, ich drucke Informationen darüber, welche Datei ich auf STDERR öffne, modifiziere die Zeilen ein wenig und schiebe sie auf das Array, dann schließe die Datei. – Frank
ändern wie? Wie könnte es pro Zeile mit einer map-Anweisung gemacht werden? Ich finde etwas auf einem Array zu drücken, um sehr verdächtig zu sein, wieder zugunsten anderer Techniken. manchmal kann es nicht geholfen werden, obwohl –