Liste aus Funktion zurückgeben
Hallo,
warum kann ich die aus der Funktion zurückgegebe Liste nicht verwenden?
my [at] keywords = getKeywords();
for (my $i; $i < [at] keywords; $i++) {
print $keywords[$i]."\n";
}
sub getKeywords {
my [at] keywords;
my ($select) = qq{SELECT keyword
FROM content_requests
GROUP BY keyword};
my $sth = $db_content_report->prepare($select);
$sth->execute();
while (my $hash_ref = $sth->fetchrow_hashref()) {
my $keyword = $hash_ref->{keyword};
push( [at] keywords, $keyword);
}
return \ [at] keywords;
}
Gruß,
Thomas B
Re: Liste aus Funktion zurückgeben
On 2008-01-14 16:07:03 +0100, Thomas Barth <txbarth [at] web.de> said:
> Hallo,
> warum kann ich die aus der Funktion zurückgegebe Liste nicht verwenden?
Weil du eine Referenz auf eine Liste zurückgibst.
> return \ [at] keywords;
Nimm den \ weg.
Re: Liste aus Funktion zurückgeben
"Matthias Peick":
>> Hallo,
>> warum kann ich die aus der Funktion zurückgegebe Liste nicht verwenden?
>
> Weil du eine Referenz auf eine Liste zurückgibst.
>
> > return \ [at] keywords;
>
> Nimm den \ weg.
Oder schreibe richtiger (und effizienter):
my $keyword_ref = getKeywords();
for (my $i; $i < [at] $keyword_ref; $i++) {
print $keyword_ref->[$i]."\n";
}
getKeywords() liefert eine Arrayreferenz ("Zeiger" auf das Array)
dh., einen Scalar, zurück. Den kannst du dann wie gezeigt
derefenzieren, um zu den Arrayelementen zu kommen.
In deinem Code hingegen schreibst du die von getKeywords()
gelieferte Arrayreferenz in das Element 0 von [at] keywords.
Diese Array enthält daher nur ein Element, folglich wird die
Schleife nur einmal durchlaufen, die dir dann den Wert des
ersten Elements - die Arrayreferenz - ausgibt.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: ferdinand.bolhar-nordenkampf [at] wien.gv.at
Re: Liste aus Funktion zurückgeben
Thomas Barth schrieb:
> Hallo,
> warum kann ich die aus der Funktion zurückgegebe Liste nicht verwenden?
>
>
> my [at] keywords = getKeywords();
>
> for (my $i; $i < [at] keywords; $i++) {
> print $keywords[$i]."\n";
> }
Das ist eine Schleife wie man sie z.b. in C programmiert, Perl kann das
viel einfacher, z.b. so
foreach ( [at] keywords) {
print "$_\n";
}
>
> return \ [at] keywords;
um die Funktion möglichst flexibel zu halten würde ich hier schreiben:
return wantarray ? [at] keywords : \ [at] keywords;
und prinzipiell eher mit einer Referenz arbeiten, da ansonsten u.U.
mehrere Kopien des Arrays im Speicher sind.
Strupp.i