Schrift
[thread]5830[/thread]

fetchen

Leser: 1


<< >> 8 Einträge, 1 Seite
mho
 2003-10-17 16:35
#64406 #64406
User since
2003-09-12
30 Artikel
BenutzerIn
[default_avatar]
Hallo

Ich möchte eine Funktion, die ähnlich funktioniert wie fetchrow_array, schreiben.

fetchrow_array liefert in einer Schlaufe Array nach Array zurück:
Code: (dl )
while ( @rv = $sth->fetchrow_array() ) {...}

Meine Funktion soll auch eine Liste von Arrays returnen.
Wie stellt man das an?

Mein Ansatz war:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub myfetcher
   {
   my ($self,@a,@b,@c,@v);

   ($self) = @_;

   @a = (1,2);
   @b = (3,4);
   @c = (5,6);

   @v = (\@a,\@b,\@c);

   foreach ( @v )
       {
       return $_->[0], $_->[1];
       }
   }


Dies liefert aber unendlich das Array @a, also 1 & 2 zurück.
Weis jemand wie man dies sauber löst?

mfg mho
pq
 2003-10-17 17:06
#64407 #64407
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
dafür musst du dir bei jedem subroutinen-aufruf merken, was du zuletzt
zurückgeben hast. am besten merkst du dir das in dem objekt $self.
vereinfacht geht es mit einer closure:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
{
 my $index = 0;
 sub myfetcher {
  my @a = (1,2);
  my @b = (3,4);
  my @c = (5,6);
  my @v = (\@a,\@b,\@c);
  $index++;
  # $index zurücksetzen und nichts zurückgeben (=leere liste)
  $index=0, return if $index > @v; # --- Edit: $index = 0 anstatt 1
  return $v[$index-1]->[0], $v[$index-1]->[1];
 }
}
\n\n

<!--EDIT|pq|1066400451-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2003-10-17 17:09
#64408 #64408
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Du kannst return nur ein einziges Mal aufrufen. Denn wie der Name schon sagt, wird damit die Funktionsabarbeitung verlassen.
Mach das lieber so:
Code: (dl )
return \@array1, \@array2, \@arry3;
Crian
 2003-10-17 17:14
#64409 #64409
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich denke, pq's Lösung entspricht eher den Wünschen von mho, da die Funktion ja bei verschiedenen Aufrufen verschiedene Dinge zurückliefern soll (wofür auch immer...).
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
mho
 2003-10-17 17:14
#64410 #64410
User since
2003-09-12
30 Artikel
BenutzerIn
[default_avatar]
logisch, merci!
betterworld
 2003-10-17 17:16
#64411 #64411
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=Crian,17.10.2003, 15:14]Ich denke, pq's Lösung entspricht eher den Wünschen von mho, da die Funktion ja bei verschiedenen Aufrufen verschiedene Dinge zurückliefern soll (wofür auch immer...).[/quote]
Ich hatte pq's Loesung noch nicht gesehen, als ich meinen letzten Beitrag schrieb. Das "Du" darin bezog sich auf mho.
Crian
 2003-10-17 17:20
#64412 #64412
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=betterworld,17.10.2003, 15:16]Ich hatte pq's Loesung noch nicht gesehen, als ich meinen letzten Beitrag schrieb. Das "Du" darin bezog sich auf mho.[/quote]
War schon klar, dass Du Dich auf mho bezogst. Ich hätte nämlich fast auch eine Antwort in Deiner Art geschrieben, sah dann aber dass von "in einer Schleife" die Rede war...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
betterworld
 2003-10-17 17:26
#64413 #64413
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Anyways, jedenfalls fand ich es sinnvoll, mho explizit zu sagen, dass man return nur einmal aufrufen darf. Denn so, wie es aussah, wusste er das nicht.
<< >> 8 Einträge, 1 Seite



View all threads created 2003-10-17 16:35.