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
...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.
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;
}
Damit dürfte ich mich nun endgültig als purer Pixelschubser geoutet haben

Liebe Grüße,
Mark.