ubuntuusers.de

Perl vs. Python

Status: Gelöst | Ubuntu-Version: Ubuntu
Antworten |

Yasser Team-Icon

(Themenstarter)

Anmeldungsdatum:
30. März 2005

Beiträge: 358

Wohnort: Kiel

RUHEEE! 😉

Also: es geht nicht darum, welche Sprache besser ist vom Standpunkt der Funktionsvielfalt aus. Was ICH machen will, können beide, das weiß ich bereits. Es ist ja nicht so, dass ich mich damit noch nie beschäftigt habe ...

Es geht mir darum, welche dem Einsteiger besser die Prinzipien des Programmierens vermitteln kann. Was ich zB meine: Variable in Python ist ohne Deklaration(?), in Perl mit nem $. Didkatisch betrachtet halte ich daher (nicht nur wegen meines Beispiels) Perl für die bessere Wahl.

Ich bin 28, seit 3 Jahren bei Linux und in ca. 10 Foren mit weit über 1000 Beiträgen. Ich weiß, was solche Threads für eine Gefahr bringen. Und was ich genau so weiß: solche Threads werden bereits anhand des Titles vollständig interpretiert und der iNhalt nur übeflogen. SCNR.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

Sid Burn hat geschrieben:

Es ist einfach nur der Verlauf der Diskussion. Ich würde gerne mal eine Neutrale Diskussion sehen. Ich sagte das die Sprachen relativ gleich sind, und das die Auswahl welche Sprache man nimmt auf die Vorlieben beruhen. Ich habe Punkte genannt die z.B. gut an Perl sind.

Was danach aber folgte ist doch lächerlich. Hängt es davon ob wieviele Paradigmen eine Sprache kann? Ist das irgendwie relevant? Was hat den die extra nennung gebracht? Warum schwappt das ganze gleich wieder dazu über das man eine Sprache klar als "besser" herausstellen muss?

Ich denke genau das ist das was mit Komplexen Deinerseits gemeint war. Da steht doch nur welche Paradigmen Python "kann". Das interpretierst Du gleich als "Python ist klar besser als Perl"-Aussage. Perl kann die doch auch alle, oder nicht? Und ich denke es ist auch relevant ob eine Sprache mehrere Paradigmen unterstützt. Ob man Anfängern besser eine vorsetzt die "rein" ist oder vielseitig, ist dann wieder eine andere Diskussion.

Von einer Diskussion würde ich erwarten das z.B. Perl Programmierer kommen Ihre Sprachen beschreiben, vielleicht Gründe nennen warum Sie diese gewählt haben, es kommen Python Programmierer die Ihre Sprache beschreiben und Gründe nennen warum Sie daran Programmieren. Vielleicht kommen ja noch Ruby, TCL oder Java Leute dazu die etwas über Ihre Sprache schreiben. Jeder nennt paar Vorteile, Gründe gibt etwas Lesestoff zu der Thematik, und der Leser kann sich selber aussuchen was er macht.

Das war doch der Tenor der meisten Postings, man sollte verschiedene ausprobieren und die nehmen die einem zusagt.

Man sollte allerdings nicht nur positiv über seine Lieblingssprache schreiben dürfen, nur um des lieben Friedens willen. Ich finde zum Beispiel man sollte schon davor warnen mit C anzufangen wenn man Texte bearbeiten will.

Chaoswind

Anmeldungsdatum:
10. August 2005

Beiträge: 544

Ob die Variablen und verschiedenen Typen mit speziellen Zeichen beginnen oder nicht, hat mit Programmieren an sich nichts zu tun. Du kannst mit Python genauso beginnen wie mit Perl, Ruby, Smalltalk oder C. An und für sich hat Python sogar den Vorteil das es Anfaengerfreundlicher ist, gerade weil die Syntax leichter ist. Man hat weniger womit man sich rumschlagen muss, weniger zum merken und kann sich eher auf das wesentliche konzentrieren. Da die Sprache aber obendrein auch sehr mächtig ist, kann man mit ihr Wachsen und die stärken nach und nach erforschen. Als Freund von Python ist meine Meinung natuerlich Subjektiv gefärbt, also interpretiere es wie du willst.

Ansonsten noch ein Rat. Wenn Perl so stark in betracht ziehst, dann solltest du unbedingt einen blick auf Ruby werfen.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Es geht mir darum, welche dem Einsteiger besser die Prinzipien des Programmierens vermitteln kann. Was ich zB meine: Variable in Python ist ohne Deklaration(?), in Perl mit nem $. Didkatisch betrachtet halte ich daher (nicht nur wegen meines Beispiels) Perl für die bessere Wahl.

Hmm, was meinst du genau mit "Prinzipien des Programmierens"? Irgendwie ist mir durch dein Beispiel auch nicht so ganz klar was du meinst.

Bei Perl kann die Deklaration Optional sein, und Standardmäßig ist sie das zur Zeit noch. Noch weil es bei Perl6 nicht mehr so sein wird. Bei Perl5 wird eine Variable durch die erste Verwendung automatisch angelegt, möchtest du es erzwingen das jede Variable vorher deklariert wird kannst du "use strict;" schreiben, und es gibt Fehler wenn du eine nicht deklarierte variable benutzt. Bei Code der etwas mehr als paar Zeilen groß ist, empfiehlt dir jeder "use strict;" und das ist auch das was dir in Büchern erzählt wird. Vorallem bei Großen Projekten sollte es sowas aufjedenfall geben.

Perl selber besitzt ein Sigil für die Variablen. Anhand des Sigils kannst du immer sehen was gerade zurück gegeben wird, das ist aber nicht immer $ für eine variable. $ steht für einen Skalaren Wert. Also einen einzelnen Wert. @ benutzt du bei Arrays oder Listen, also bei mehrere Skalaren Werten, und bei einem Hash benutzt du % was eine Zuordnung zwischen zwei Skalaren ist.

Ob das "richtig" ist würde ich jetzt nicht sagen, es ist halt nur eine Form.

Andere Sprachen wie bei C z.B. musst du immer an die Funktionen ein "()" anhängen, folgt nichts dann weist du das es eine variable ist.

Bei Perl5 ist es noch so das deine Rückgabe das Sigil entscheidet, hast du ein Array liest aber nur ein Wert aus, benutzt du trotzdem ein "$", da du halt nur einen Skalaren Wert aus der Menge der Skalare augewählt hast. Liest du mehrere Werte aus dem Array aus, benutzt du wieder @. Das kann unter umständen auch verwirrend sein. Bei Perl6 wird sich das komplett ändern, so das das Sigil immer anzeigen wird, um welchen Variablen Typ es sich handeln wird, also wirst du @ immer bei einem Array benutzen, egal wieviele Werte du ausliest. Was ich Persönlich auch besser finde, als so wie es zur Zeit ist.

Ein richtig oder falsch gibt es wohl nicht, kommt halt darauf an was dir am meisten gefällt, und aus welcher Sicht du das ganze betrachtest.

Ich denke genau das ist das was mit Komplexen Deinerseits gemeint war. Da steht doch nur welche Paradigmen Python "kann". Das interpretierst Du gleich als "Python ist klar besser als Perl"-Aussage.

Nein, dass habe ich so nicht aufgefasst. Wenn aber der ganze Post daraus besteht nur zu sagen das noch ein Paradigma unterstützt wird, dann Interpretiere ich das schon hinein. Ich wollte lediglich Aussagen das Perl Multiparadigmatisch ist, so wie es auch Python ist. Wenn es mir um die Vielfalt gegangen wäre hätte ich die anderen auch gleich genannt, halte das ganze aber wie gesagt für unwichtig. Ob Multiparadigmatisch nun gut oder schlecht ist, muss auch wieder jeder für sich entscheiden.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

Yasser hat geschrieben:

Es geht mir darum, welche dem Einsteiger besser die Prinzipien des Programmierens vermitteln kann. Was ich zB meine: Variable in Python ist ohne Deklaration(?), in Perl mit nem $.

Das $ in Perl sagt, das der folgende Name als Skalarwert interpretiert werden soll.

Didkatisch betrachtet halte ich daher (nicht nur wegen meines Beispiels) Perl für die bessere Wahl.

Ich finde Python besser. Einfachere Syntax, durch und durch objektorientiert, nicht so viel "Magie".

@Chaoswind: Ich denke funktional darf sich jede Sprache nennen, in der man Funktionen als Parameter in der Gegend herumreichen kann.

Chaoswind

Anmeldungsdatum:
10. August 2005

Beiträge: 544

Marc 'BlackJack' Rintsch hat geschrieben:

@Chaoswind: Ich denke funktional darf sich jede Sprache nennen, in der man Funktionen als Parameter in der Gegend herumreichen kann.

Darüber kann man sich sicherlich trefflich streiten. Zumindest das Funktionale Paradigma ist aber recht klar definiert. Warum ich aber gefragt habe, war die tatsache das ich bisher bei keiner Diskussion über Perl erlebt hab das jemand Perl als Funktional bezeichnet. Daher will ich gerne wissen was genau damit gemeint ist.

Yasser Team-Icon

(Themenstarter)

Anmeldungsdatum:
30. März 2005

Beiträge: 358

Wohnort: Kiel

Ich hoffe, dass ihr euch sehr genau überlegt habt, wenn ihr sagt, man müsse es ausprobieren. Ich werde mein Perl-Programm jetzt in Python umschreiben und dann vergleichen.
Vielen Dank!

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4686

Wohnort: Berlin

Von Sprache X in Sprache Y umschreiben klingt nicht gut. Du solltest Sprache Y in Grundzügen lernen und dann das Problem neu lösen. Und am besten die Lösung in geeigneter Runde vorstellen und fragen ob Du die Sprache adäquat eingesetzt hast. Verschiedene Sprachen haben unterschiedliche Arten eine Lösung auszudrücken, sonst bräuchte man ja keine verschiedenen Sprachen wenn man alles 1:1 semi-automatisch umsetzen könnte.

Kleines Beispiel für Python das häufig bei Leuten vorkommt, die "C-artige" Sprachen kennen:

foo = [42, 'spam', None]
for i in range(len(foo)):
    print foo[i]

Die "pythonische" Lösung sieht so aus:

foo = [42, 'spam', None]
for item in foo:
    print item

Oder Leute die einen Java-Hintergund haben, kommen oft gar nicht auf die Idee, dass man Funktionen auch als Argumente übergeben kann.

Blattlaus

Avatar von Blattlaus

Anmeldungsdatum:
29. März 2006

Beiträge: 1399

Es gibt eine Sache die Python Perl voraushat: Man wird gezwungen (mehr oder weniger sauber) zu arbeiten.
In Perl kann man, wenn man es denn möchte, den größten Rotz hinschreiben und es läuft trotzdem (obwohl es nach 10 Minuten niemand mehr versteht), in Python hingegen muss man sich an Dinge wie Einrückungen halten damit es überhaupt läuft. Daher finde iiiich das Python irgendwie hübscher ist.
Achtung: Ich sage nicht das Perl hässlich und unlogisch ist, aber es hindert einen nichts daran es hässlich und unlogisch zu gestalten.

Und ja, ich bin mir sicher gleich kommt irgendein Perl-Freak (Hallo Sid 😉 ) und legt gerade das als großen Vorteil von Perl aus...naja...kommt vermutlich auf den Standpunkt an. 🙄

smurfix

Server-Team
Avatar von smurfix

Anmeldungsdatum:
3. November 2004

Beiträge: 162

Wohnort: Nürnberg

Ich war auch mal ein Perl-Freak... inzwischen bin ich zu Python gewechselt.

Gründe?

- Ausnahmenbehandlung. Liefert ein Python-Befehl Unfug, siehst du es und dein Programm kracht dir um die Ohren. Ein typisches Perl-Programm läuft einfach weiter.

- Lesbarkeit. Meinen Python-Code kann ich noch zwei Jahre später lesen, weil mir gar ncihts anderes übrigbleibt als sauberen Code zu schreiben. Perl verleitet viel zu sehr dazu, zu schludern. Mehr Aufwand ist das auch nicht, weil dafür die ganzen Sonderzeichen wegfallen. (Inklusive der geschweiften Klammern um jeden Block. Einrücken, so ich sauber programmiere, muss ich so oder so.)

- Klare Syntax. Eine Python-Funktion wird aufgerufen, indem man das Ding hinschreibt und Klammern dahinter platziert, mit Argumenten drin. In Perl? Naja. Ausnahmen über Ausnahmen. In Perl kann ich (wiedermal mit spezieller Syntax) eine Funktion als Argument an eine andere Funktion weitergeben, aber eine gebundene Methode (d.h. die eines bestimmten Objekts)? Nur mit Krücken – und das Ding aufzurufen ist auch nervig. In Python kommt einem solche "fortgeschrittenen" Sachen schnell einfach nur normal vor.

- Alles ist ein Objekt. Ja, auch Funktionen oder Zahlen. Perl nicht.

- Vernünftige Behandlung von Dateideskriptoren. Perl kennt mittlerweile drei verschiedene Arten, eine offene Datei zu referenzieren, die *nicht* vollständig untereinander austauschbar sind – irgendwas fliegt immer auf die Nase. Pthon hat das Problem nicht.

- Ganze Zahlen haben keinen Maximalwert. Perl wirft, so meine Zahl zu groß wird, einfach die "uninteressanten" Bits weg.

- Funktionen mit benannten Argumenten. (Kann man mit Perl auch hinbiegen, aber genau das ist es – hingebogen.)

Ich mag Perl hier nicht schlecht machen – es hat auch seine Vorteile (wer viel mit regulären Ausdrücken machen muss, ist z.B. mit Perl wirklich besser bedient), und es gibt auch abgesehen davon ausreichend viele Leute, die mit perl besser zurechtkommen. Aber ich halt nicht.

PS: Was auch immer du tust: Lerne nicht als erste Sprache PHP. Ernsthaft.

Yasser Team-Icon

(Themenstarter)

Anmeldungsdatum:
30. März 2005

Beiträge: 358

Wohnort: Kiel

Marc 'BlackJack' Rintsch hat geschrieben:

Von Sprache X in Sprache Y umschreiben klingt nicht gut. Du solltest Sprache Y in Grundzügen lernen und dann das Problem neu lösen. Und am besten die Lösung in geeigneter Runde vorstellen und fragen ob Du die Sprache adäquat eingesetzt hast. Verschiedene Sprachen haben unterschiedliche Arten eine Lösung auszudrücken, sonst bräuchte man ja keine verschiedenen Sprachen wenn man alles 1:1 semi-automatisch umsetzen könnte.

Kleines Beispiel für Python das häufig bei Leuten vorkommt, die "C-artige" Sprachen kennen:

foo = [42, 'spam', None]
for i in range(len(foo)):
    print foo[i]

Die "pythonische" Lösung sieht so aus:

foo = [42, 'spam', None]
for item in foo:
    print item

Oder Leute die einen Java-Hintergund haben, kommen oft gar nicht auf die Idee, dass man Funktionen auch als Argumente übergeben kann.

Ich will die selbe Aufgabenstellung in Python umsetzen. Dann zeige ich euch die jeweiligen Lösungen. Natürlich versuche ich, die Sprache so umzusetzen, wie es vorgesehen ist.

Also an die Arbeit;)

Chaoswind

Anmeldungsdatum:
10. August 2005

Beiträge: 544

smurfix hat geschrieben:

- Alles ist ein Objekt. Ja, auch Funktionen oder Zahlen.

Vollkommen richtig. Mit der ausnahme das nicht alles ein Objekt ist. Befehlswörter sind keine Objekte, genauso wie direkt geschriebene Zahlen. 5.__add__(3) funktioniert also leider nicht 😉

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Ja, da kann ich Marc nur zustimmen, einfach den Code von einer in der anderen Sprache zu Schreiben ist ziemlich schlecht, du musst wenn es geht die Sprache von Anfang an Lernen und es mit den Eigenschaften der Sprache versehen. Ich nehme auch mal oberes Beispiel und kreiire die verschiedenen Perl Möglichkeiten.

Vorweg, da halt der "print" Befehl bei Perl im Listenkontext Arbeitet, würde man das ganze in perl letztendlich wohl so schreiben:

my @foo = qw/42 spam none/;
print @foo;


Man sagt also: "Gib das Array aus", und nicht "Laufe über das Array von 0 bis zur Maixmalen anzahl und gib mir jeweils das Element aus."

Jemand der nur C kennt wird es zu Anfang wohl eher so schreiben:

my @foo = ('42', 'spam', 'None');
for (my $i=0; $i<scalar @foo; $i++) {
    print $foo[$i];
}

Die erste Verbesserung wäre eine leichtere Deklaration, und eine leichtere for Schleife:

@foo = qw/42 spam none/;
for my $i (@foo) {
    print $i;
}

Da es hier eigentlich Logisch sein sollte das man über jedes Element des Arrays Itterriert, kann man sich natürlich fragen warum man explizit eine Zählvariabel angeben muss, also macht der Erfahrene perl programmierer hier etwas Magie:

for (@foo) {
    print;
}


Schneller geschrieben, schneller gelesen, und du wirst den Sinn schneller verstehen. Sofern du darin geübt bist.

Da du nur ein befehl benutzt ist es eigentlich unsinnig einen Block zu benutzen.

@foo = qw/42 spam none/;
print for @foo;


Das kannst du Lesen wie es da steht. "print" für jedes Element aus "@foo".

Ansonsten kommt es noch weiter darauf an. Wenn du die Elemente einfach nur ausgeben möchtest, brauchst du keine Zwischenvariable.

print for qw/42 spam None/;

Oder wie benutzen den Funktionalen Ansatz, für jedes Element aus dem Array wird eine Funktion aufgerufen.

my @foo = qw/42 spam none/;
map print, @foo;

Sofern man im programmcode einfach nur die Werte ausgeben möchte, kann man wie gesagt wieder auf die Temporäre variable verzichten.

map print, qw/42 spam None/;

Da die Sachen einfach nur aneinander gereit werden, kann es sein das wir z.B. Leerzeichen zwischen den Werten haben wollen.

my @foo = qw/42 spam none/;
print "@foo";


Dadurch das das Array im String ist, wird beim Interpolieren einfach die Werte in ein Einzelnen String verwandelt und mit leerzeichen voneinander getrennt.

An sich ist die obere Aussage eigentlich falsch. Den es wird zwischen den Werten eigentlich der Inhalt aus der Spezialvariable $" genommen. Wenn wir diese variable z.B. auf "\n" setzen, dann werden die Werte mit einem "\n" zusammengefügt. Das heißt wir würden auf jeder zeile ein Wort stehen haben.

my @foo = qw/42 spam None/;
$" = "\n";
print "@foo\n";

Anstatt die Spezialvariable zu überschreiben können wir aber auch wieder den etwas Funktionaleren Teil nehmen. Und die Elemente zusammenfügen, ein String daraus bauen, und dann erst ausgeben.

my @foo = qw/42 spam None/;
print join "\n", @foo;

Oder alles in einem:

print join "\n", qw/42 spam None/;

Oder anstatt einen String zu bauen, einfach jedes Element zusätzlich mit einem "\n" ausgeben lassen.

my @foo = qw/42 spam None/;
map print "$_\n", @foo;

Oder wir geben einfach für jedes Element 2 Werte aus, das element selber + ein Newline Zeichen, und dieser Rückgabewert wird wieder an print übergeben.

my @foo = qw/42 spam None/;
print map( ($_, "\n"), @foo);

Oder man könnte auch hingehen und eine Funktion für jede Listenelement ausführen lassen. In der dann z.B. noch größere Veränderungen gemacht werden könnten. Das Beispiel ist natürlich so sinnloss soll nur Zeigen das es auch möglich ist.

my @foo = qw/42 spam None/;
map ausgabe($_), @foo;

sub ausgabe {
    my $input = shift;
    print $input;
}

u.s.w.

smurfix

Server-Team
Avatar von smurfix

Anmeldungsdatum:
3. November 2004

Beiträge: 162

Wohnort: Nürnberg

Chaoswind hat geschrieben:

smurfix hat geschrieben:

- Alles ist ein Objekt. Ja, auch Funktionen oder Zahlen.

Vollkommen richtig. Mit der ausnahme das nicht alles ein Objekt ist. Befehlswörter sind keine Objekte,

Das sind sie in keiner Sprache. Macht auch verdammt wenig Sinn.

Chaoswind hat geschrieben:

genauso wie direkt geschriebene Zahlen. 5.__add__(3) funktioniert also leider nicht 😉

Doch, sind sie, du hast nur vergessen dass der Punkt mehrdeutig ist (Fließkommazahl).

>>> (5).__add__(3)
8
>>> 5.1.__add__(3)
8.0999999999999996
>>> # Hmm, wir wollen aber was Lesbares
>>> x=5.1.__add__(3); print x
8.1


😛

Chaoswind

Anmeldungsdatum:
10. August 2005

Beiträge: 544

smurfix hat geschrieben:

Chaoswind hat geschrieben:

smurfix hat geschrieben:

- Alles ist ein Objekt. Ja, auch Funktionen oder Zahlen.

Vollkommen richtig. Mit der ausnahme das nicht alles ein Objekt ist. Befehlswörter sind keine Objekte,

Das sind sie in keiner Sprache. Macht auch verdammt wenig Sinn.

Ruby_(Programmiersprache)#Programmierbeispiele

In der Objektorientierung ergibt das ziemlich viel Sinn. Und Smalltalk z.b. geht da ja noch einen Schritt weiter.