Hallo, wie kann ich mit Perl einen Suchmuster-String in all seine Möglichkeiten aufspalten? Okay, das hat bestimmt keiner verstanden. ;-) Ich versuche mein Vorhaben anhand eines Beispieles zu erklären. Ich habe folgenden String: 123ZZ6 (Dabei steht Z für alle zahlen von 0...2) Den würde ich gerne in folgende Strings aufspalten: 123006 123016 123026 123106 123116 123126 123206 123216 123226 Wie stelle ich das am schlausten an? Viele Grüße Bastian
Abend
wie kann ich mit Perl einen Suchmuster-String in all seine Möglichkeiten aufspalten?
Okay, das hat bestimmt keiner verstanden. ;-) Ich versuche mein Vorhaben anhand eines Beispieles zu erklären.
Ich habe folgenden String: 123ZZ6 (Dabei steht Z für alle zahlen von 0...2)
Den würde ich gerne in folgende Strings aufspalten: 123006 123016 123026 123106 123116 123126 123206 123216 123226
Wie stelle ich das am schlausten an?
Willst Du überprüfen, ob Muster zutreffen (z.B. ob eine beliebige Zahl in obiges Schema paßt) oder willst Du eine Menge der möglichen Ausprägungen erzeugen (z.B: Deine obige Liste)? Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Seelig sind die, die da arm an Geist sind, denn sie werden 4 sich Christlich Soziale Union nennen.
Bodo Kaelberer schrieb:
Abend
wie kann ich mit Perl einen Suchmuster-String in all seine Möglichkeiten aufspalten?
Okay, das hat bestimmt keiner verstanden. ;-) Ich versuche mein Vorhaben anhand eines Beispieles zu erklären.
Ich habe folgenden String: 123ZZ6 (Dabei steht Z für alle zahlen von 0...2)
Den würde ich gerne in folgende Strings aufspalten: 123006 123016 123026 123106 123116 123126 123206 123216 123226
Wie stelle ich das am schlausten an?
Willst Du überprüfen, ob Muster zutreffen (z.B. ob eine beliebige Zahl in obiges Schema paßt) oder willst Du eine Menge der möglichen Ausprägungen erzeugen (z.B: Deine obige Liste)?
Ja, ich möchte eine Liste mit allen möglichen Ausprägungen erzeugen. Viele Grüße Bastian
On Fri, Apr 08, 2005 at 12:47:07AM +0200, Bastian Schern wrote:
wie kann ich mit Perl einen Suchmuster-String in all seine Möglichkeiten aufspalten?
split.
Okay, das hat bestimmt keiner verstanden. ;-)
Jep.
Ich habe folgenden String: 123ZZ6 (Dabei steht Z für alle zahlen von 0...2)
Wie stelle ich das am schlausten an?
Regexp: if ( /^...([0-2][0-2])./ ) { switch ( $1 ) { case "00": ... break; case "01": ... break; default: ... break } } Falls du eine Permutation meinst, also so viele Strings herstellen willst, wie deine Vorgabe hergibt, so macht man das mit verschachtelten Schleifen: foreach my $i ( 0..2 ) { foreach my $j ( 0..2 ) { print "123${i}${j}6\n"; } } -- Peter
Peter Wiersig schrieb:
Falls du eine Permutation meinst, also so viele Strings herstellen willst, wie deine Vorgabe hergibt, so macht man das mit verschachtelten Schleifen:
foreach my $i ( 0..2 ) { foreach my $j ( 0..2 ) { print "123${i}${j}6\n"; } }
Ja, ich möchte eine Liste mit allen möglichen Ausprägungen erzeugen. Allerdings steht in dem Musterstring wirklich "Z" drin und es können beliebig viel "Z" in einem Suchmusterstring stehen. Kann man das vielleicht mit Rekursiven Funktionen lösen? ... Wenn ich nur daran denke verknotet sich bereits alles bei mir im Kopf. ;-) Viele Grüße Bastian
On Friday 08 April 2005 09:53, Bastian Schern wrote:
Ja, ich möchte eine Liste mit allen möglichen Ausprägungen erzeugen. Allerdings steht in dem Musterstring wirklich "Z" drin und es können beliebig viel "Z" in einem Suchmusterstring stehen. Kann man das vielleicht mit Rekursiven Funktionen lösen? ... Wenn ich nur daran denke verknotet sich bereits alles bei mir im Kopf. ;-)
Ganz spontan würde ich sagen: Vergiß es. Im Normallfall ist die Länge dieser
Liste unendlich - schon beim ersten "*" oder "+". Auch wenn sie endlich ist,
ist sie eigentlich immer VERDAMMT lang.
CU
--
Stefan Hundhammer
Hallo, Am Freitag 08 April 2005 09:53 schrieb Bastian Schern:
Peter Wiersig schrieb:
Falls du eine Permutation meinst, also so viele Strings herstellen
willst, wie deine Vorgabe hergibt, so macht man das mit verschachtelten Schleifen:
foreach my $i ( 0..2 ) { foreach my $j ( 0..2 ) { print "123${i}${j}6\n"; } }
Ja, ich möchte eine Liste mit allen möglichen Ausprägungen erzeugen. Allerdings steht in dem Musterstring wirklich "Z" drin und es können beliebig viel "Z" in einem Suchmusterstring stehen. Kann man das vielleicht mit Rekursiven Funktionen lösen? ... Wenn ich nur daran denke verknotet sich bereits alles bei mir im Kopf. ;-)
Abgesehen davon, dass die Liste (wie schon erwähnt) ziemlich lang wird [0], ja. Aber erstmal eine sehr spezielle, lahme, nicht rekursive Variante, die wahrscheinlich funktioniert, wenn du keine Kommas im String hast: $str = '123ZZ6'; $str =~ s/([^,]*)Z([^,]*)(,|$)/$1.0.$2,$1.1.$2,$1.2.$2/g; @ergebnisliste = split('/,/', $str); Rekursiv könntest du das ganz allgemein machen (hier nur eher schematisch, da ich faul bin): #Die Substituenten %substis = ( Z => ['0', '1', '2'] ); @ergebnisliste = rekvar('123ZZ6'); sub rekvar { $str = shift; # Suche einen in $str vorhandenen Substituenten # Wenn einer existiert, ersetze ihn durch alle möglichen Varianten # Rufe für jede dieser Varianten rekvar() auf # und sammle die Variante, die es zurückgibt push(@varianten, rekvar($variante)); # Gebe alle Varianten zurück return @varianten; } Da sind jetzt einige Lücken in der Umsetzung, aber das Prinzip dürfte klar sein. So kann man sogar mehrere Substituenten usw. ohne Mehraufwand haben. Man kann einen Substiuenten nur nicht durch einen solchen ersetzen, da es dann eine Endlosschleife geben dürfte. Ferdinand [0] Bei 10 Zs 3^10 = 59049 Varianten
Hallo, Am Fri, 08 Apr 2005, Peter Wiersig schrieb:
On Fri, Apr 08, 2005 at 12:47:07AM +0200, Bastian Schern wrote:
wie kann ich mit Perl einen Suchmuster-String in all seine Möglichkeiten aufspalten?
split.
Okay, das hat bestimmt keiner verstanden. ;-)
Jep.
Jep.
Ich habe folgenden String: 123ZZ6 (Dabei steht Z für alle zahlen von 0...2)
Wie stelle ich das am schlausten an? [..] Falls du eine Permutation meinst, also so viele Strings herstellen willst, wie deine Vorgabe hergibt, so macht man das mit verschachtelten Schleifen:
foreach my $i ( 0..2 ) { foreach my $j ( 0..2 ) { print "123${i}${j}6\n"; } }
for my $i (0..2) { print "123${i}${_}6\n" for (0..2); } for my $i (0..2) { print map { "123${i}${_}6\n" } (0..2); } print map { my $i=$_; map { "123${i}${_}6\n" } (0..2) } (0..2) Have fun! -dnh --
Irgendwann werden sie glauben. Der Mensch ist zum Glauben geboren, sonst wäre dieKirche nicht so reich. Ui, der is schön. Darf ich den siggen? Bidde bidde. [Jakob Krieger und Marian°®¥ in dag°]
Hallo
wie kann ich mit Perl einen Suchmuster-String in all seine Möglichkeiten aufspalten?
Vermutlich gibt es das sicher irgendwo als fertiges perl Modul. Hier aber eine einfache (nicht kryptische) Implementation. ============= snip ================= #!/usr/bin/perl -w use strict; # configuration # ------------- my $pattern = '1Z23ZZ6'; my $varchar = 'Z'; my $range = '0123456789'; # 1. search all permutable chars # ------------------------------ my %permutable; my $pos = 0; while( ($pos = index( $pattern, $varchar, $pos )) >= 0 ) { $permutable{$pos} = 0; $pos++; } # 2. create the permutations. # --------------------------- my $overflow = 0; do { # display the current permutation my $text = $pattern; while( my ($pos, $range_pos) = each( %permutable ) ) { substr( $text, $pos, 1, substr( $range, $range_pos, 1 ) ); } print "$text\n"; # mutate for my $key ( keys %permutable ) { $permutable{$key}++; if( $permutable{$key} >= length( $range ) ) { $permutable{$key} = 0; $overflow = 1; } else { $overflow = 0; last; } } } while( ! $overflow ); =================== snip ===================== Gruss Tobias
participants (7)
-
Bastian Schern
-
Bodo Kaelberer
-
David Haller
-
Ferdinand Ihringer
-
Peter Wiersig
-
Stefan Hundhammer
-
Tobias Erbsland