Forum Doku Wiki Blog

Forumsarchiv 2008, November
zwei probleme

archivierte Beiträge lesen

  1. (PERL) zwei probleme von keno, 18. 11. 2008, 08:48

zwei probleme

Der folgende Beitrag wurde am 18. 11. 2008, 08:48 Uhr von keno veröffentlicht.

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

zwei probleme

Der folgende Beitrag wurde am 18. 11. 2008, 12:27 Uhr von LX veröffentlicht.

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

Handgestrickte DB

Der folgende Beitrag wurde am 18. 11. 2008, 15:46 Uhr von Beat veröffentlicht.

> 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

Handgestrickte DB

Der folgende Beitrag wurde am 18. 11. 2008, 20:25 Uhr von keno veröffentlicht.

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

© 1998-2013 SELFHTMLImpressumSoftware: Classic Forum 3.4