AlexBausW: Ärgerliches if-statement

Beitrag lesen

Hallo Bernhard,

Also das habe ich jetzt schon öfters beobachtet, und es gibt mir ein wenig zu denken: Jedesmal wenn ich ein Script zum Anschauen online stelle, dann scheint es euch die Sprache zu verschlagen !

Ich hab` schon mal reingeschaut, aber konnte nicht gleich was entdecken. Und nebenbei betreibe ich, wie vielleicht auch andere, noch eine Hauptbeschäftigung sowie weitere Nebenbeschäftigungen (Hier verkehren also nicht nur Studenten, Hausfrauen, Arbeitslose und Rentner ;-)

Bin ich denn echt so schlecht :-(

Nicht wirklich ;-) Aber imho gibt es schon noch ein paar Anmerkungen *g* (Imho ist meine Programmierstil auch nicht sonderlich gut, aber man lernt ja nie aus. Ich kenne auch nur einen, der von sich behauptet, seine Programmierkünste wären nicht nur scheinbar grandios ;-).
Ich will jetzt nicht den Perl-Lehrer spielen, das können andere besser, aber ich möchte einige Sachen anmerken, die _ich_ mir im Laufe der Zeit angewöhnt habe (und vielleicht auch einige andere):
Als erstes deklariere alle Variablen mit my(), local() oder use vars(). Dabei hilft "use strict;" Andernfalls machst Du alle Variablen der Subroutinen global, was Dir früher oder später Scherereien verursachen kann (außerdem gibts afaik Ärger mit mod_perl ;-).
Imho ist es auch ungünstig, innerhalb einer Subroutine einen Wert in eine globale Variable schreiben zu lassen. "$wert = &getWert();" ist imho aussagekräftiger für jemanden, der Deinen Code lesen muss ;-) Außerdem funktionieren so ähnlich auch Perls interne Funktionen: entweder sie geben einen Wert zurück den Du haben möchtest (shift(),join()), oder sie verändern den übergebenen Wert (chomp()) [ganz grob gesagt ;-)]
Optimierungspotential liegt, wie wir in einem Posting von ?weisnichtmehr? gelesen haben, in jedem Code. Ich persönlich verwende "" nur dann, wenn der String nach Variablen geparst werden soll, oder Steuerzeichen enthält. Ansonsten ziehe ich '' vor, was afaigh (asfarasigelesesenhab ;-) Dein Skript beschleunigen kann (ich weis nicht, ob Stringparsen viel langsamer ist als viele Stringverknüpfungen, aber das kann sicher einer der Eggsbädde beantworten;-)

Zu Deinem alten Problem mit $laenge = @_; :
Das brauchst Du eigentlich gar nicht, da Du ja alle Elemente von @_ verändern willst. Schreibe doch einfach "foreach (@_){}". Das spart Dir zwei Variablen (ist ja noch nicht so viel), und vor jede Zeile $_[$i] zu schreiben (das ist ein wenig mehr *g*), da sich nun die Elemente von @_ in $_ durchgereicht werden.
Einen "Verbesserungsvorschlag" hätte ich auch noch :-) Statt für jedes Tag "$_[$i] =~ s/[br]/<br>\n/g;" zu schreiben, kannst Du auch folgende RegEx verwenden, die imho leichter zu erweitern ist:
   my @tags = ('br','p','b','u','i');
   my $regex = join('',@tags);
   foreach (@_) {
      s![\s*(/)\s*($regex)\s*]!<$1$2>!oig;
      .    ^......^..........^........sicherheitshalber, man kann ja nie wissen ;-)
      .    kann man aber auch weglassen und so eine saubere Eingabe erzwingen
   }
Wie Du siehst, brauchst Du nur dem Array die zu erkennenden Tags einverleiben und feddisch :-)
Ob das performanter ist, kann ich nicht beantworten. Perl kompiliert normalerweise RegEx beim Skriptaufruf. Enthält die RegEx jedoch Variablen, wird der Ausdruck erst zur Laufzeit kompiliert (die Variable könnte sich ja ändern). Das kann die Performance beeinträchtigen (z.B.: bei häufigem Aufruf oder bei "großen" RegEx wie zur Erkennung von rfc-konformen URLs ;-), ist aber hier vermutlich nicht relevant. Damit die RegEx nur einmal zu Laufzeit kompiliert wird, kann man den Modifier 'o' verwenden (compile once).
Vielleicht fällt jemand Anderem noch etwas zum Thema ein. Ansonsten, wie sollte es bei Perl auch anders sein, gibt es zu allem eine Doku: perldoc perlstyle ;-) (Aber jeder findet irgendwie seinen Stil)

Aber zu meinem Problem, das hat sich heute morgen in Luft aufgelöst:

[...]

Naja, jetzt gehts jedenfalls :-)

Dann wieder viel Spaß mit Perl :-)

Gruß AlexBausW

Please visit my SELFvisitingcard @ http://www.atomic-eggs.com/selfspezial/daten/150.html