Schrift
[thread]9009[/thread]

subroutine mit foreach schleife



<< >> 9 Einträge, 1 Seite
blaise4714
 2007-05-14 19:26
#76714 #76714
User since
2007-04-18
22 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo @ll,
ich habe da eine frage. In mein perl Code gibt es ein Subroutine;
In dieser Subroutine gibt es eine foreach Schleife; Nach jeder durchlauf soll sie einen wert zurückgeben.
Ich möchte dieser durchlauf über meinen hauptprogram kontrollieren und beinflüssen. Sozusagen:
Code: (dl )
1
2
3
4
5
6
7
8
9
test.pl
sub beispiel {
@array= (was, wie,wo,wann,wozu,wieso);
foreach $array(@array) {
return $array;
}
}
#hautprogramm
$give_the_next_string = beispiel...; #to complete

geht es überhaupt?
danke im voraus!
Froschpopo
 2007-05-14 19:28
#76715 #76715
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
was verstehst du unter "kontrollieren" ?
lichtkind
 2007-05-14 20:10
#76716 #76716
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
was auch immer du willst ich denke erstmal es geht in perl aber das return innerhalb des schleifenblocks ist wohl nicht genau was du willst. versuch erstmal genauer aufzuschreiben was du überhaupt möchtest.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
blaise4714
 2007-05-14 20:15
#76717 #76717
User since
2007-04-18
22 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi!
Zum Beispiel: bei einer erster Anfrage(foreach durchlauf); wird "was" zurückgegeben nach der 2. "wie" usw.
Froschpopo
 2007-05-14 20:30
#76718 #76718
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ausm Bauch heraus und ungetestet:
Vielleicht sowas?

Code: (dl )
1
2
3
4
5
6
my $next_index = sub {
my @array= (was, wie,wo,wann,wozu,wieso);
return defined $array[$_[0]+1] ? $array[$_[0]+1] : $array[0];
}

$callback = $next_index->(2);
\n\n

<!--EDIT|Froschpopo|1179164440-->
Ronnie
 2007-05-14 21:18
#76719 #76719
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Das wäre ein Iterator:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

sub iterator (@) {
my @items = @_;
return sub { return shift @items };
}

my $next_item = iterator qw/foo bar buz/;
print Dumper $next_item->() for 0..3;
lichtkind
 2007-05-14 21:30
#76720 #76720
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
ne so wird das nichts, das ruft nach einer closure oder einer state variable wenn du ein bleed perl hast
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
sub beispiel {
    my $zaehler;
    @array= (was, wie,wo,wann,wozu,wieso);
    return = sub {
        $zaehler = 0 if scalar @array > $zaehler;
        return $array[$zaehler++];
    }
}
$frager = beispiel();
$erste_antwort = $frager();
$zweite_antwort = $frager();

das ganze geht auch noch wesentlich einfacher wenn nur von einer stelle aus gefragt wird. dieses beispiel würde halt auch gehen wenn verschiedene fragesteller durcheinander fragen und bei jeder anfrage immer das jewails nächste element des arrays bekommen. du sagtest noch nicht was geschehen soll wenn das letzte erreicht ist.\n\n

<!--EDIT|lichtkind|1179163878-->
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
Froschpopo
 2007-05-14 21:41
#76721 #76721
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
my $next_index = sub {
my @array= (was, wie,wo,wann,wozu,wieso);
return defined $array[$_[0]+1] ? $array[$_[0]+1] : $array[0];
}

$callback = $next_index->(2);

fängt bei 0 wieder an wenn letzter index erreicht ist... kannst ja $array[0] auch durch undef oder so ersetzen jenachdem was du brauchst...
topeg
 2007-05-15 00:06
#76722 #76722
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Dafür gibt es doch die Objektorientierung:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package liste;
sub new
{
  my $self={list=>[@_]};
  bless($self);
  return $self;
}

sub next
{
  my $self=shift(@_);
  my $l=$self->{list};
  push(@$l,shift(@$l));
  return $$l[0];
}

sub before
{
  my $self=shift(@_);
  my $l=$self->{list};
  unshift(@$l,pop(@$l));
  return $$l[0];
}

sub now
{ 
  my $self=shift(@_);
  return $$self->{list}[0];
}
package main;

my $list=liste::new(was, wie,wo,wann,wozu,wieso);

for(0..6)
{
  print $list->next();
  print "\n";
}
<< >> 9 Einträge, 1 Seite



View all threads created 2007-05-14 19:26.