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
- beim Lesen gnädig mit Daten umgehen
- Beim schreiben sich strikt an die Ordnung in @db_fields halten
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