Hallo, Ich habe folgendes Problem, dessen Lösung bestimmt einfach ist. Von der Struktur ist es folgendes Perlskript: use FreezeThaw qw(cmpStr); my $struktur = INPUT1; my %alphabet = INPUT2; while(my ($a, $b) = each %alphabet) { #Variante 1 if (strCmp($struktur, $b) == 0) { print "Gefunden $a\n" }; #Variante 2 if(strCmp($struktur, $b) == 0) { print "Gefunden $a\n"; return $a" } } Bei meinem Test wird dies als Subroutine fünfmal in einer Schleife aufgerufen und es sollte 'hallo' gefunden werden. Bei Variante 1 kommt das auch: Gefunden: h Gefunden: a Gefunden: l Gefunden: l Gefunden: o Bei Variante 2 hingegen nicht: Gefunden: h Gefunden: l Gefunden: o Muss ich das verstehen? Oder hat irgendwer eine Idee, woran dies liegen könnte und wo ich zu suchen haben? Gerade wundert mich das nur. Ich verändere ja den Hash nicht. perl --version This is perl, v5.8.5 built for i686-linux Ferdinand
Hmmm... So klappt es: Am Samstag 26 Februar 2005 23:38 schrieb Ferdinand Ihringer:
Hallo,
Ich habe folgendes Problem, dessen Lösung bestimmt einfach ist. Von der Struktur ist es folgendes Perlskript: use FreezeThaw qw(cmpStr);
my $struktur = INPUT1; my %alphabet = INPUT2;
my %newalphabet = %alphabet;
while(my ($a, $b) = each %alphabet) { #Variante 1 if (strCmp($struktur, $b) == 0) { print "Gefunden $a\n" }; #Variante 2 if(strCmp($struktur, $b) == 0) { print "Gefunden $a\n"; return $a" } }
Bei meinem Test wird dies als Subroutine fünfmal in einer Schleife aufgerufen und es sollte 'hallo' gefunden werden. Bei Variante 1 kommt das auch: Gefunden: h Gefunden: a Gefunden: l Gefunden: l Gefunden: o Bei Variante 2 hingegen nicht: Gefunden: h Gefunden: l Gefunden: o
Verstehen tue ich das Problem trotzdem nicht. Es wird wohl mit dem each zusammenhängen, aber das %alphabet wird ja bei jedem Aufruf der Subroutine erneut übergeben. Ferdinand
Hallo Ferdinand, hallo Leute, Am Samstag, 26. Februar 2005 23:38 schrieb Ferdinand Ihringer:
Ich habe folgendes Problem, dessen Lösung bestimmt einfach ist. Von der Struktur ist es folgendes Perlskript: use FreezeThaw qw(cmpStr);
Das Modul habe ich gerade nicht vorrätig, deshalb die theoretische Analyse ;-) [...]
while(my ($a, $b) = each %alphabet) { #Variante 1 if (strCmp($struktur, $b) == 0) { print "Gefunden $a\n" }; #Variante 2 if(strCmp($struktur, $b) == 0) { print "Gefunden $a\n"; return $a" } }
Bei meinem Test wird dies als Subroutine fünfmal in einer Schleife aufgerufen und es sollte 'hallo' gefunden werden. Bei Variante 1 kommt das auch: Gefunden: h Gefunden: a Gefunden: l Gefunden: l Gefunden: o Bei Variante 2 hingegen nicht: Gefunden: h Gefunden: l Gefunden: o Muss ich das verstehen? Oder hat irgendwer eine Idee, woran dies liegen könnte und wo ich zu suchen haben?
Das return, das ja normalerweise zum Verlassen einer Subroutine o. ä. verwendet wird (siehe auch perldoc -f return), scheint zu verursachen, dass jeweils ein Schleifendurchlauf übersprungen wird. Überleg Dir eine Lösung, die ohne das return in der Schleife auskommt, und es müsste funktionieren ;-) Gruß Christian Boltz --
man procmailex Procmailex, ist das sowas wie Ameisen-Ex oder Fliegen-Ex? Dann hätte ich gerne ein große Familienpackung. [Thorsten Haude in suse-linux]
Hallo, Am Donnerstag 03 März 2005 19:58 schrieb Christian Boltz:
Hallo Ferdinand, hallo Leute,
Am Samstag, 26. Februar 2005 23:38 schrieb Ferdinand Ihringer:
Ich habe folgendes Problem, dessen Lösung bestimmt einfach ist. Von der Struktur ist es folgendes Perlskript: use FreezeThaw qw(cmpStr);
Das Modul habe ich gerade nicht vorrätig, deshalb die theoretische Analyse ;-)
[...]
while(my ($a, $b) = each %alphabet) { #Variante 1 if (strCmp($struktur, $b) == 0) { print "Gefunden $a\n" }; #Variante 2 if(strCmp($struktur, $b) == 0) { print "Gefunden $a\n"; return $a" } }
Bei meinem Test wird dies als Subroutine fünfmal in einer Schleife ^^^^^^^^^^ aufgerufen und es sollte 'hallo' gefunden werden. Bei Variante 1 kommt das auch: Gefunden: h Gefunden: a Gefunden: l Gefunden: l Gefunden: o Bei Variante 2 hingegen nicht: Gefunden: h Gefunden: l Gefunden: o Muss ich das verstehen? Oder hat irgendwer eine Idee, woran dies liegen könnte und wo ich zu suchen haben?
Das return, das ja normalerweise zum Verlassen einer Subroutine o. ä. verwendet wird (siehe auch perldoc -f return), scheint zu verursachen, dass jeweils ein Schleifendurchlauf übersprungen wird.
Überleg Dir eine Lösung, die ohne das return in der Schleife auskommt, und es müsste funktionieren ;-)
Ich habe es ja in einer Subroutine. Das schrieb ich nur nachtraeglich dazu, aber doch noch lesbar. Inzwischen geht es ja. Und dieses Projekt werde ich sowieso nur noch einpaar Tage verfolgen. Dann dokumentiere ich es. Brenne alles auf CD. Drucke es aus. Stecke alles in einen Briefumschlag, sende es in der Hoffnung, nie wieder von ihm zu sehen, an den Bundeswettbewerb Informatik und bin glücklich. Soviel zur notwendigen Qualität. :-) Ferdinand
participants (2)
-
Christian Boltz
-
Ferdinand Ihringer