Liste aus Funktion zurückgeben

Liste aus Funktion zurückgeben

am 14.01.2008 16:07:03 von Thomas Barth

Hallo,
warum kann ich die aus der Funktion zurückgegebe Liste nicht verwenden?


my @keywords = getKeywords();

for (my $i; $i < @keywords; $i++) {
print $keywords[$i]."\n";
}


sub getKeywords {
my @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(@keywords, $keyword);
}

return \@keywords;
}

Gruß,
Thomas B

Re: Liste aus Funktion zurückgeben

am 14.01.2008 17:02:17 von Matthias Peick

On 2008-01-14 16:07:03 +0100, Thomas Barth said:

> Hallo,
> warum kann ich die aus der Funktion zurückgegebe Liste nicht verwenden?

Weil du eine Referenz auf eine Liste zurückgibst.

> return \@keywords;

Nimm den \ weg.

Re: Liste aus Funktion zurückgeben

am 15.01.2008 09:35:14 von Ferry Bolhar

"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 \@keywords;
>
> Nimm den \ weg.

Oder schreibe richtiger (und effizienter):

my $keyword_ref = getKeywords();

for (my $i; $i < @$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 @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@wien.gv.at

Re: Liste aus Funktion zurückgeben

am 15.01.2008 12:54:29 von struebig

Thomas Barth schrieb:
> Hallo,
> warum kann ich die aus der Funktion zurückgegebe Liste nicht verwenden?
>
>
> my @keywords = getKeywords();
>
> for (my $i; $i < @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 (@keywords) {
print "$_\n";
}

>
> return \@keywords;

um die Funktion möglichst flexibel zu halten würde ich hier schreiben:

return wantarray ? @keywords : \@keywords;

und prinzipiell eher mit einer Referenz arbeiten, da ansonsten u.U.
mehrere Kopien des Arrays im Speicher sind.

Strupp.i