[linux-l] Programmieren in Perl 1 (was: python)

Steffen Dettmer steffen at dett.de
Mo Mai 20 16:18:03 CEST 2002


* Olaf Radicke wrote on Sun, May 19, 2002 at 21:08 +0000:
> On Sun, May 19, 2002 at 07:58:09PM +0200, Dr. Bernd Freistedt wrote:
> > ---Olaf Radicke (linux-l at mlists.in-berlin.de) wrote on Sun, 19 May 2002 17:32:30 +0000
> > 
> > > Ich bin jetzt doch von Perl auf Python umgestiegen. 
> > 
> > fein :-)

Warum? Perl fetzt doch.

> Zum Schluss hatte mein Perl-Prog 1100 Zeilen Code und
> ich bin nicht mehr durch gestiegen bei den debugging.

Na, für Spaghetti-Code kann ja auch Perl nix. Wenn man schon bei
1100 Zeilen nicht mehr durchsieht, hat man meist wirklich viel
falsch gemacht.

> (und ich habe alle Register gezogen: use strict, 
> use diagnostics...)

Na ja, Qualität kann man schlecht im Nachhinein einbauen. Man
sollte sinnvolle Funktionen verwenden, das klar strukturieren
etc., dann klappts auch mit dem Nachbarn.
Programmieren/Entwickeln fängt eben mit Zettel und Stift an...

> [...]
> > Aber ueberlege doch, ob Du in Python das Array ueberhaupt
> > brauchst. Sicher geht Dein Problem eleganter zu loesen.
> 
> Nun, ich will damit die einträge in Menue, in meinen Programm
> zählen. Sie werden der Reihe nach angezeigt, und ich (b.z.w.
> das Prog) muss wissen wenn es am Ende angelangt ist.

In Perl nimmt man da foreach:

foreach $entry (@menu) {
	$menu->add($entry);
}

finde ich sehr gut lesbar und elegant. Das Zählen erübrigt sich
durch die Syntax :)

> Sonst gibt es ein Zugriff auf ein nicht definierten Wert.

Nur mal am Rande. Ich finde das "um die Ecke gedacht". Du hast
eine Liste von Menüpunkten, ja? Warum zählen? In Wirklichkeit
interessiert Dich das überhaupt nicht, Du möchtest ja nur mit
jedem Eintrag etwas machen. Die Anzahl brauchst Du ja nur, wie Du
ja schreibst, um das Ende zu erkennen. Leute, die von C kommen,
denken klassisch meist so: "ein Zähler von null bis Anzahl der
Elemente, dann das Element mit Index == Zähler nehmen". Aber man
kann doch auch sagen: "solange Element in Liste, mache jenes":

for (i=0; $list[i]; i++) { 
	jenes($list[i]); 
}

Und genau dafür gibt's dann einen foreach operator. Ist in Perl
so ziemlich das gleiche wie ein passendes for, das kann auch
Listen, hier ist foreach nur besser lesbar. Dann versteht man
auch den Code. Die Programmiersprache kann da wenig dafür, man
kann jede vergewaltigen, nicht nur C/C++ :-)


> Und die Menue-Einträge habe ich in Array's abgespeichert um
> sie bequem mit
>  
> #- schnipp -#
> menue_punkt += 1
> mein_menue_array[menue_punkt]
> #- schnapp -#
>  
> durchlaufen zu lassen.

Das findest Du bequem? Analog würde ich in Perl schreiben (wenn
es schon so rum sein muß):

menu_punkt(mein_menue_array[menue_punkt]) 
	if mein_menue_array[++menue_punkt];

oder vielleicht:
menu_punkt(mein_menue_array[menue_punkt]) 
	unless !defined(mein_menue_array[++menue_punkt]);

Das ist lesbar: Mache menupunkt, wenn es einen Menupunkt gibt.
Oder im zweiten Beispiel: Mache menupunkt, außer wenn das nicht
definiert ist. Aber wie gesagt, wenn man die richtige Schleife
verwendet, stellt sich das Problem überhaupt nicht. Das Problem
ist selbst erzeugt.

> Danke für die Antwort. Ich habe es DANN auch gefunden in
> meinen Buch unter "len()" im Index.

In Perl ist die Länge von @array übrigens $#array + 1. Warum +1?
Weil $#array der Wert des letzen Indexes ist, und genau das
braucht man meistens auch:

for ($i=0; $i <= $#array; $i++) {
	tue_was ($array[$i]);
}

oder sowas. Aber ich finde:
foreach $elem (@array) {
	tue_was ($elem);
}

logischer, mehr "straight-forward", also mehr "geradeaus
gedacht".

Man kann auch sagen: Man macht hier etwas mit jedem Element. Mach
mappt sozusagen eine Aktion auf jedes Element. Das kann man genau
so in Perl schreiben:

map { tue_was ($_) } @array;

Auch hier muß man überhaupt nicht wissen, wie groß das array nu
ist, oder ob da überhaupt was drin steht. Man hat es damit
schöner gelöst, der Code ist viel klarer und einfacher zu
verstehen. Man muß es eben nur richtig machen.

oki,

Steffen

-- 
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.



Mehr Informationen über die Mailingliste linux-l