[QUIZ#1] Mark (Perl)

Mark

Cinema4D
Hi!

Hm, wird wahrscheinlich super peinlich gegenüber dem Zweizeiler eines echten Perl-Programmierers, aber ich wollte mal schauen, ob wenigstens ein Fünkchen von Perl bei mir hängen geblieben ist ;)

Perl:
#!/usr/bin/perl

use CGI;
$CGI = new CGI;

print "Content-type: text/html\n\n";
print "tutorials.de Coding-Quiz #1 - Unscharfe Suche<br /><br />\n";

#	Sucheingabe per Html-Form 				
$suche	= $CGI->param('suche');
print '<form><input type="text" name="suche" value="' . $suche . '" /></form>' . "\n";

#	Leerzeichen entfernen & Kleinschreibung	
$suche =~ s/ //g;
$suche = lc($suche);


#	Kein Suchbegriff						
if (!$suche) {
	print 'Bitte Suchbegriff eingeben.';

#	Unscharfe Suche							
} else {
	#	Präsidenten einlesen		
	my @praesidenten = &DatenLaden();

	#	Unscharf Suchen				
	my @gefunden = &UnscharfSuchen($suche, @praesidenten);

	#	Keine Treffer				
	if (!@gefunden) {
		print 'Die unscharfe Suche ergab keine Treffer.';
	
	#	Treffer-Ausgabe				
	} else {
		foreach my $praesident (@gefunden) {
			print &Markieren($suche, $praesident, '<i>', '</i>') . "<br />\n";
		}
		print @gefunden . ' Treffer';
	}
}

#	========================================
#	Gibt Array mit Daten zurück				
sub DatenLaden
{
	my @daten;
	open ($datei, '<', "presidents.txt") or die $!;
	while(<$datei>)
	{
		chomp;
		push(@daten, $_);
	}
	close $datei;
	return @daten;
}

#	========================================
#	Gibt Array mit Treffern zurück			
sub UnscharfSuchen
{
	my ($suche, @daten) = @_;
	
	#	RegExp zusammenbauen					
	my $s = join('.*?', split(//, $suche));
	
	#	ReqExp ausführen						
	return grep { /$s/i } @daten;
}

#	========================================
#	Gibt String mit markierter Suche zurück	
sub Markieren
{
	my ($suche, $datum, $mstart, $mende) = @_;
	
	#	Datum in Buchstaben zerlegen		
	my @buchstaben = split(//, $datum);
	
	my $markiert = '';
	my $posakt = 0; 	# aktuelle Position	
	my $posvor = 0; 	# vorherige Position

	#	Suchbuchstaben markieren			
	foreach( split(//, $suche) ) {
		$posakt = index(lc($datum), $_, $posakt);
		if ($posakt > $posvor) {
			$markiert .= $mende if ($posvor > 0);
			$markiert .= substr($datum, $posvor, ($posakt-$posvor)) . $mstart;
		} elsif ($posvor == 0) {
			$markiert .= $mstart;
		}
		$markiert .= substr($datum, $posakt, 1);
		$posakt++;
		$posvor	= $posakt;
	}
	$markiert .= $mende . substr($datum, $posvor, length($datum));
	
	return $markiert;
}
...diesmal eine andere Lösung für die "Markierungs-Tags", als bei meiner Php-Variante.

Damit dürfte ich mich nun endgültig als purer Pixelschubser geoutet haben :)

Liebe Grüße,
Mark.
 
Hey Mark,

das sieht doch nicht schlecht aus :) Das einzige was mich stört: nachdem du die unscharfe Suche elegant über einen regulären Ausdruck abgewickelt hast, durchsuchst du beim Markieren den String nochmal "zu Fuß". Könnte man nicht irgendwie beim Suchen schon die Trefferinformationen abspeichern und diese dann für die Markierung weiterverwenden? Mein Perl ist leider etwas eingerostet, ich weiß es selber also nicht :)

Damit dürfte ich mich nun endgültig als purer Pixelschubser geoutet haben :)
Als Pixelschubser, der auch noch programmieren kann, und das nicht mal schlecht :eek: Ich zähle fest darauf, dass du dem Coding Quiz auch in den kommenden Runden treu bleibst :)

Grüße,
Matthias
 

Mark

Cinema4D
Hi Matthias!
Das einzige was mich stört: nachdem du die unscharfe Suche elegant über einen regulären Ausdruck abgewickelt hast, durchsuchst du beim Markieren den String nochmal "zu Fuß". Könnte man nicht irgendwie beim Suchen schon die Trefferinformationen abspeichern und diese dann für die Markierung weiterverwenden?
Da bin ich mir sogar sicher ... nur, ICH konnte es nicht ;) Die RegExp in Perl scheinen ja das mächtigste Tool schlecht hin zu sein, so mancher Code besteht ausschließlich daraus ... ich habe sie aber leider nie wirklich verstanden ;)
Als Pixelschubser, der auch noch programmieren kann, und das nicht mal schlecht :eek: Ich zähle fest darauf, dass du dem Coding Quiz auch in den kommenden Runden treu bleibst :)
Vielen Dank! :-( Mal schauen, was da noch so für Aufgaben kommen, denn da ich mit Sicherheit 2-3 mal so lange (ach, länger ;) ) für die Umsetzung brauche, wie ein Programmierer, könnten aufwändigere Aufgaben mein Zeit-Budget überlasten... ;)

Vielen Dank für Dein Feedback! :)
Liebe Grüße,
Mark.
 

Teambeta

Erfahrenes Mitglied
Schönes Ergebnis.

Ich wollt eigentlich auch noch ein Perl-Script schreiben, aber ich habe schon solange nichts mehr mit Perl gemacht, dass ich doch lieber aufgehört habe eines zu basteln.