Re: Auspaltung eines Suchmuster-String mit Perl

Ferdinand Ihringer <[email protected]>
Newsgroups gmane.linux.suse.programming
Message-ID <[email protected]>
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


-- 
Um die Liste abzubestellen, schicken Sie eine Mail an:
    [email protected]
Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken
Sie eine Mail an: [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.