zwei probleme
keno
- perl
0 LX0 Handgestrickte DB
Beat0 keno
Ich stehe hier gerade vor zwei kleinen problemen und find einfach keine lösung ich hoffe hier kann man mir helfen!?!?
Zuerstmal:
Ich bin gerade dabei mir ein mehr oder mindergutes Blogsckript zu schreiben
Also erstens:
Ich will das nur ganz ganz bestimte teile ersetzt werden. nehmen wir an ich möchte ein hans in peter umwandeln, der aufbau der datei sieht so aus:
[IP:000.000.000][Name:keno][Blog:Hallo mein name ist hans und ich schlafe]
Jetzt will ich aus dem hans peter machen und zwar mit tie file so:
my $bla;
tie my @hanszupeter, "Tie::File", "blog.txt"
for $bla (@hanszupeter)
{
$bla =~ s/hans/peter/;
}
untie @hanszupeter;
Das klappt zwar ganz gut aber es wird in der ganzen zeile hans zu peter umgewandelt also [Name:hans] wird auch zu peter geändert ich will aber das nur der text in [Blog:...] ersetzt wird. Wi mach ich das?
Hoffentlich versteht ihr mich hehe
Dann zweitens:
Wie kann ich speziel etwas hinter einer zeile einfügen?
Beispiel:
Zeile sieht folgendermasen aus:
[IP:123.456.789][Name:kendo][Blog:schönes wetter]
Und folgendes soll dahintergeschrieben werden:
[Bewertung:1]
Die Zeile soll also nachher so aussehen:
[IP:123.456.789][Name:kendo][Blog:schönes wetter][Bewertung:1]
aufrufen kann man es dann so:
open (FH, "<blog.txt");
while (FH)
{
if ($_ =~ /[IP:123.456.789]/) {
#Hier hätte ich jetzt die zeile aber da ich die datei nur zum lesen
#geöfnet habe kann ich leider nichts in die Datei schreiben
#auch mit "open (FH, "+<blog.txt);" komm ich nicht weiter
}
}
close (FH);
wie bereits gesagt ich komm einfach nicht weiter ich habe schon mit "+<blog.txt" experimintiert und mit tie::file (geiles modul hehe) mit suchen und ersetzen mit push und so weiter ich kriegs einfach nicht hin.
Ich hoffe ihr versteht mich und könnt mir helfen
ps: ich habe mitbekommen das sich in anderen foren viele beschweren über meine ausdrucksweise oder rechtschreibung deshalb entschuldigt bitte ich bin annerkannter legastheniker hehe
vielen vielen dank schonmal im vorraus!!!!!
Vielleicht solltest Du Dein Datenformat lieber einer Datenbank überlassen und nur jene Teile Deiner Informationen mit einer RegExp behandeln, die auch wirklich behandelt werden soll.
Darüber hinaus denke bitte über das folgende Zitat nach ([quote:#1418] aus der Zitatesammlung):
"Some people, when confronted with a problem, think 'I know, I’ll use regular expressions.' Now they have two problems." --Jamie Zawinski
Gruß, LX
Ich bin gerade dabei mir ein mehr oder mindergutes Blogsckript zu schreiben
Ich will das nur ganz ganz bestimte teile ersetzt werden. nehmen wir an ich möchte ein hans in peter umwandeln, der aufbau der datei sieht so aus:
[IP:000.000.000][Name:keno][Blog:Hallo mein name ist hans und ich schlafe]
Das sieht mir eher nach Gästebuch aus.
Jetzt will ich aus dem hans peter machen
und zwar mit tie file so:
my $bla;
tie my @hanszupeter, "Tie::File", "blog.txt"
for $bla (@hanszupeter)
{
$bla =~ s/hans/peter/;
}
untie @hanszupeter;Das klappt zwar ganz gut aber es wird in der ganzen zeile hans zu peter umgewandelt also [Name:hans] wird auch zu peter geändert ich will aber das nur der text in [Blog:...] ersetzt wird. Wi mach ich das?
es folgt ein ungetesteter Entwurf.
Schreibe zuerst eine sub, welche dir die Zeile in einen hash übersetzt. manipuliere danach die gewünschten Hashelemente.
wir brauchen noch
my @db_fields = qw( IP name blog );
Diese Array legt essentiell das Format fest. Ein Update dieses Array wird auch deine andere Frage beantweorten.
sub record_to_hash{
my $hashref = shift;
my $line = shift || '';
while( $_[1] =~ /[([^:]+):([$legalinputchars]*)]/g ){
$hashref{$1} = $2;
}
}
[$legalinputchars] ist dabei eine kritische Komponente resultierend aus deinem (aus meiner Sicht problematischen) Fileformat.
und
sub hash_to_record{
my $hashref = shift;
my $field_order_ref = shift;
my $record = '';
foreach( @$field_order_ref ){
$record .=
'['. $_ .
':'. $hashref->{$_} || '' .
']';
}
return $record;
}
jetzt kannst du
for (@hanszupeter)
if(/[name:hans]/){
### Siehe Kommentar
my %temp;
record_to_hash(%temp, $_);
$temp{name} = peter;
$temp{blog} =~ s/hans/peter/g;
$_ = hash_to_record(%temp; @db_fields);
}
}
Die Zeilen liessen sich noch weiter verallgemeinern und eine zusätzliche Treiberschicht bauen.
Dann zweitens:
Wie kann ich speziel etwas hinter einer zeile einfügen?
Die Frage ist, wie kannst du deine DB treiber so gestalten, dass sie
Generell gilt: eine handgestrickte DB sollte man reiflich überlegen.
Es ist machbar und du kannst viel lernen. Aber setze deine DB erst dann ein, wenn sie sich in der Testumgebung wirklich über adequaten Daten in allen ihren Funktionen bewährt hat.
Dein Problem sind die Zeichen [:] welchen du besondere Aufmerksamkeit schenken solltest. Eventuell ist dein Fileformat suboptimal.
Es ist sicherer, Felde in Datensätzen mit einem Separator zu begrenzen, der in den Daten selbst höchstwahrscheinlich nie vorkommt.
Ich haben mich für
,\t
entschieden
wobei alle userinput mit
s/,\t/, /g
ersetzt wird.
Diese Lösung ist nur in einer CGI Umgebung via HTML Formular richtig, wo man nicht mit Userinput von \t rechnet.
mfg Beat
Vielen dank erstmal!!
Das sieht mir eher nach Gästebuch aus.
Das stimmt sogar fast ich habe mir als grundgerüst ein gästebuch genomen das ich wo runtergeladen habe
Es war die rede von einer richtigen DB aber da gibt es ein problem den ich habe das blogscript auf einem freewebspace laufen und dort gibt es weder MYSQL noch SQLITE oder ähnliches und ich kenne mich mit der handhabung von richtigen DB nicht aus :-((
Sollte ich vielleicht auf php umsteigen? Das eigned sich vielleicht besser für sowas?
DENN ......... die von Beat geschriebenen subrutinen sind mir gänzlich unklar :-(
ich werde weiter versuchen es zum laufen zu bringen trotzdem weis ich nicht warum das so sein muss hehe
vielen dank trotzden!!!