keno: zwei probleme

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!!!!!

  1. 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

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
  2. 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

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    1. 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!!!