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
Thomas Barth [ Mo, 14 Januar 2008 16:07 ] [ ID #1907801 ]

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.
Matthias Peick [ Mo, 14 Januar 2008 17:02 ] [ ID #1907803 ]

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
Ferry Bolhar [ Di, 15 Januar 2008 09:35 ] [ ID #1908829 ]

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
struebig [ Di, 15 Januar 2008 12:54 ] [ ID #1908830 ]
Perl » de.comp.lang.perl.misc » Liste aus Funktion zurückgeben

Vorheriges Thema: utf-8 Zeichen als hash-key
Nächstes Thema: Behandlung UTF-8 Zeichen Linux/Solaris