Abkürzungsverzeichnis

Hallo!

Ich möchte mir Perl beibringen. Ein paar Grundlagen habe ich mir schon durchgelesen, aber ich möchte am Liebsten mit einem kleinem Projekt anfangen, als all die Übungen in dem Handbuch der Reihe nach zu machen.
Ich habe mir also folgendes vorgestellt:

Es gibt eine Textdatei in der pro Zeile eine Abkürzung und getrennt dahinter eine Erklärung steht. Jetzt möchte ich mir eine kleine HTML Ein/Ausgabe machen, wo ich die Abkürzungen eingeben und dann dazu die Erklärungen anzeigen lassen kann.

Könnt ihr mir da ein wenig beim Start helfen. Wie gehe ich das am Besten an? Welche Funktionen, usw. soll ich mir dazu anschauen?

Noch Fragen?

mfg
christoph

Hallo,

Es gibt eine Textdatei in der pro Zeile eine Abkürzung und
getrennt dahinter eine Erklärung steht. Jetzt möchte ich mir
eine kleine HTML Ein/Ausgabe machen, wo ich die Abkürzungen
eingeben und dann dazu die Erklärungen anzeigen lassen kann.

Könnt ihr mir da ein wenig beim Start helfen. Wie gehe ich das
am Besten an? Welche Funktionen, usw. soll ich mir dazu
anschauen?

Du willst also ein CGI-Script schreiben?

Also um Eingaben vom Browser zu verarbeiten, brauchst du das Module CGI (siehe http://search.cpan.org/perldoc?CGI ).
Bei der Fehlersuche hilft auch auch noch

use CGI::Carp qw(fatalsToBrowser);

Zum öffnen einer Datei brauchst du open:

open my $filehandle, '

Lesen geht mit dem sogenannten "fish operator"; 
my $line = ;

Ansonten brauchst du vor allem print, und eventuell ein paar einfache regexes.

Grüße,
Moritz

Hallo!

Das hat mir schon viel weiter geholfen. Gestern Abend habe ich schon etwas zusammen gebracht.
Hättest du (oder auch jemand Anderer) etwas Zeit, um mein Skript anzuschauen und mir noch ein paar Tipps bzw. Verbesserungsvorschläge zu geben?

mfg
christoph

Hallo,

Hättest du (oder auch jemand Anderer) etwas Zeit, um mein
Skript anzuschauen und mir noch ein paar Tipps bzw.
Verbesserungsvorschläge zu geben?

Hinweis: Falls Du das Skript hier postest (da wird sich
sicher jemand damit befassen), dann bitte *unbedingt*
oben und unten prehtml-Tags hinschreiben:

prehtml>

 ...
 enter code here
 ...

/prehtml>

Grüße

CMБ

Hallo!

Hier also mein Skript. Die Elemente nach denen gesucht wird, sind in einer externen Datei „at.list“. Pro Zeile steht da zum Beispiel: „Gef,Gerasdorf“. Wenn man die Eingabe mit einem Großbuchstaben beginnt, wird der Ausdruck nur am Wortanfang gesucht. Ansonsten auch mitten in der Abkürzung.

#!/usr/bin/perl -w

use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);

my($filename) = ‚at.list‘;
my(@ausgabe);
my($query) = new CGI;
my($info) = $query->param(„abbr“);
my($linfo);
if (defined $info) {
if (pruefen($info) eq „true“) {
$linfo = lc($info);
open my $file, '){
my @liste = split(/,/, $_, 2);
if ($info =~ /^[A-Z]/) {
if (lc($liste[0]) =~ /^$linfo/) {
push(@ausgabe, [@liste]);
}
} else {
if (lc($liste[0]) =~ /$info/) {
push(@ausgabe, [@liste]);
}
}
}
close $file;
}
}

print $query->header,
$query->start_html("-title"=>„Betriebsstellen“,
„-style“=>{-src=>’/~christoph/screen.css’}),
$query->start_form(’-method’=>„POST“,
„-action“=>„short.pl“),
„Abkürzung: „,
$query->textfield(“-name“=>„abbr“, „-default“=>’’),
$query->end_form(),
$query->hr;
my $elemente = @ausgabe;
if ($elemente > 0) {
for my $i (0…$elemente-1) {
print $query->h3($ausgabe[$i][0]);
print $query->p($ausgabe[$i][1]);
}
print $query->end_html();
}

sub pruefen {
my $inhalt = shift;
if ($inhalt eq ‚‘) {
return „false“;
}
if ($inhalt =~ /[^a-zA-Z0-9\s]+/) {
return „false“;
}
return „true“;
}

mfg
christoph

Hallo Christoph

Hier also mein Skript. Die Elemente nach denen gesucht wird,
sind in einer externen Datei „at.list“. Pro Zeile steht da zum
Beispiel: „Gef,Gerasdorf“. Wenn man die Eingabe mit einem
Großbuchstaben beginnt, wird der Ausdruck nur am Wortanfang
gesucht. Ansonsten auch mitten in der Abkürzung.

Aha! Das Skript ist gut und funktioniert auch. Ich habs
mal überflogen und Änderungen notiert, die ich machen
würde. Z.B. würde ich alle „konfigurierbaren“ Parameter
oben in eine Sektion zusammenfassen und die Prüffunktion
ganz weglassen. Ich würde mir vielleicht auch einen extra-Key
für falsche Eingaben definieren (‚FEHLER‘ oder sowas)
und eine entsprechende Nachricht ausgeben.

Hier mal meine Variante (soll keine große Kritik an Deinem
Skript sein, dient nur der Verdeutlichung alternativer
Herangehensweisen). Dein Skript ist ansonsten völlig o.k.
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);

Konfiguration:

my $css_loc = ‚/~christoph/screen.css‘;
(my $data_pt = $ENV{SCRIPT_FILENAME}) =~ s{/[^/]+$}{}; # physischen Pfad zu
my $data_loc = „$data_pt/at.list“; # Daten bestimmen, korrekten Pfad setzen

my $q = new CGI; # CGI laden, gleich Parameter extrahieren
my $info = $q->param(‚abbr‘);
$info = ‚Fehler‘ if $info =~ /[^\w]/ || !length $info; # Validierung

die html-Ausgabe auf jeden Fall eroeffnen

print $q->header, $q->start_html(-title=>‚Betriebsstellen‘, -style=>{-src=>$css_loc});

file oeffnen

open my $fh, '[0] =~ /^$info/i ) # entweder
|| ( $info=~/^[^A-Z]/ && $_->[0] =~ /$info/i ), # oder
map [split /\s*,\s*/, $_, 2],
;
close $fh;

bei der Ausgabe kann man gleich $ENV{SCRIPT_NAME} verwenden

print $q->start_form(-method=>‚POST‘, -action=>$ENV{SCRIPT_NAME}),
$q->p(‚Abkürzung:‘),
$q->textfield(-name=>‚abbr‘, -default=>’’),
$q->end_form(), $q->hr();

Ausgabe des gefundenen Textes

print map $q->h3($_->[0]) . $q->p($_->[1]), @ausgabe;
print $q->end_html();

Grüße

CMБ

Hallo Semjon!

Aha! Das Skript ist gut und funktioniert auch. Ich habs
mal überflogen und Änderungen notiert, die ich machen
würde. Z.B. würde ich alle „konfigurierbaren“ Parameter
oben in eine Sektion zusammenfassen und die Prüffunktion
ganz weglassen. Ich würde mir vielleicht auch einen extra-Key
für falsche Eingaben definieren (‚FEHLER‘ oder sowas)
und eine entsprechende Nachricht ausgeben.

Hier mal meine Variante (soll keine große Kritik an Deinem
Skript sein, dient nur der Verdeutlichung alternativer
Herangehensweisen). Dein Skript ist ansonsten völlig o.k.

Vielen Dank für das Anschauen und kommentieren. Ein paar der „Tricks“ muss ich mir noch anschauen, damit ich weiß was da genau passiert.

Hier habe ich noch eine Zeile hinzugefügt
my $q = new CGI; # CGI laden, gleich Parameter extrahieren
my $info = $q->param(‚abbr‘);
$info = ‚Fehler‘ if !(defined $info);
$info = ‚Fehler‘ if $info =~ /[^\w]/ || !length $info;
da sonst, wenn man keinen Parameter übertragen hat (also bei leerem Feld) ein Fehler in der ‚error.log‘ aufgetaucht ist.

Dieses kleine Projekt hat mir jetzt so richtig Lust gemacht, mir perl gut anzuschauen. Macht Spaß.

mfg
christoph

P.S.: Aber die regulären Ausdrücke muss man glaub ich auswendig lernen, sonst muss man dauernd nachschauen. Sogar bei selbst geschriebenem Code vom vorigen Tag.