[Vienna-pm] Suchen nach Begriffen innerhalb strukturierter Datei

Thomas Klausner domm at zsi.at
Fri Jan 2 17:52:26 CST 2004


Hi!

On Fri, Jan 02, 2004 at 10:31:52PM +0100, Christian Schoeller wrote:

> Ich habe hierzu eine Webseite mit zwei Formularen: im einen sind
> (Vorname|Nachname|Strasse|PLZ|Wohnort) einzugeben; diese Daten werden
> - schoen formatiert - in der Textdatei "dbase" abgespeichert. Im

Warum nicht in einer richtigen DB? Wenn eine DB installieren zu muehsam ist,
kann ich zB SQLite sehr empfehlen
  http://search.cpan.org/~msergeant/DBD-SQLite-0.29/
ist eine "richtige" SQL-DB, die aber alles in einem file speichert & keinen
Server braucht.

> -- <dbase exemplarisch> --
> Vorname: Benjamin
> Nachname: Bluemchen
> Strasse: Zuckerstueckchenstrasse 1
> PLZ: 0101
> Ort: Neustadt
> -- </dbase> --

Hmm. Wie werden einzelne Eintraege getrennt?

Wenn schon flat file, dann wuerde ich YAML als Format nehmen:
  http://search.cpan.org/~ingy/YAML-0.35/

Oder XML, aber das ist IMO muehsam und overhyped.

> -- <search.pl> --
> #!/usr/bin/perl

use warnings;
use strict;

> use CGI qw(:standard);
> print "Content-type: text/plain\n\n";
> my $such=param('such');
> open DBASE, "<dbase";
> my $zeilen=join '', <DBASE>;
> if ($zeilen=~(/.*(Vorname.*?$such.*?\n{2}).*/is)) {
>     print $1;
> } else {
>     print "Keine Entsprechung gefunden!\n";
> }
> -- </search.pl> --
> 
> Mein Problem ist jetzt, dass "search.pl" natuerlich immer nur _einen_
> Datensatz zurueckgibt. Falls Benjamin nun heiraten sollte, wuerde
> seine Frau mit dem Suchbegriff "Bluemchen" nicht mehr gefunden werden
> (oder eben Benjamin selbst, abhaengig davon, wo er in "dbase"
> eingetragen ist).

Ja, anders geht das wohl kaum, wenn du das so machst.


> Moeglicherweise liege ich allerdings auch _komplett_ falsch und mein
> Skript hat sowieso den falschen Ansatz.

Sorry, aber das sehe ich auch so :-)

Ich empfehle:

my @hits;
foreach my $datum (@datensaetze) {
  push(@hits,$datum) if $datum=~/$such/;
}

wobei du bei deiner Datenstruktur ev ein Problem hast, das flat-file-ding in
einen Array aufzusplitten

allerdings koennte das zB so gehen (wenn du nicht YAML oder XML oder so
verwenden willst:)

dbase:
 Vorname: Benjamin
 Nachname: Bluemchen
 Strasse: Zuckerstueckchenstrasse 1
 PLZ: 0101
 Ort: Neustadt
 ###SEPERATOR###
 Vorname: Benttina
 Nachname: Bluemchen
 Strasse: Zuckerstueckchenstrasse 1
 PLZ: 0101
 Ort: Neustadt

such.pl:
...
open DBASE, "<dbase";
my $zeilen=join '', <DBASE>;
my @datensaetze=split(/###SEPERATOR###/,$zeilen);


oder:
$/="###SEPERATOR###\n";
foreach (<DBASE>) {
  push(@hits,$datum) if $datum=~/$such/;
}

$/ ist der INPUT_RECORD_SEPARATOR, siehe perldoc perlvar

> Danke fuer die Hilfe!

gerne, wenns denn hilft...


-- 
#!/usr/bin/perl                               http://domm.zsi.at
for(ref bless{},just'another'perl'hacker){s-:+-$"-g&&print$_.$/}



More information about the Vienna-pm mailing list