hmm: Apache Server: GCI File kann .css Datei nicht nutzen

Hi,

ich habe mir einen Docker Container mit einerm Apache Server gebastelt. Dort habe ich dann ein Python Projekt mit einer main.cgi Datei abgelegt.

Die Struktur sieht so aus:

cgi-bin / projekt1 / css / css-files

cgi-bin / project1 / main.cgi

Leider bekomme ich beim Aufruf der main.cgi Datei im Browser einer 500 Internal Server Error. Kommentiere ich die CSS Zeile aus funktioniert das Script. Außerdem bekomme ich beim Aufruf von url\cgi-bin\projekt1\css\blabla.css ebenfalls einen 500 Error. Wenn ich CSS Dateien in den Ordner /var/www/html packe, kann ich sie im Browser aufrufen, allerdings führt eine Verlinkung dieser Datei in der main.cgi Datei ebenfalls zu einem 500 Error.

Muss ich irgendetwas in der httpd.conf einfügen damit das klappt? Oder fehlt da etwas anderes?

akzeptierte Antworten

  1. Hallo hmm,

    Kommentiere ich die CSS Zeile aus funktioniert das Script.

    Wie sieht diese CSS Zeile denn im Script aus? Inclusive der Zeilen drumherum?

    Das Durcheinander von projekt1 vs project1 und / vs \ ist hoffentlich nur beim Tippen ins Forum entstanden.

    Der Abruf einer statischen Ressource sollte keinen HTTP 500 erzeugen können, es sei denn, die Serverkonfiguration stimmt nicht. Ist im css oder css/css-files Ordner eine .htaccess Datei? Wenn die einen Typo enthält, kann das den HTTP 500 auslösen (wobei man beim Dockern keine .htaccess Dateien nutzen, sondern alles in die httpd.conf schreiben sollte. Performance!).

    Wie sich der Apache bei bedingten Direktiven verhält, weiß ich nicht. Wenn z.B. innerhalb eines <Directory> Blocks oder in einer von RewriteCond abhängigen Zeile ein Tippfehler befindet, könnte der beim Laden der Config-Datei gefunden werden, oder erst dann, wenn die Bedingung zutrifft, die diese Zeile aktiviert. Da gibt's viele Möglichkeiten.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Der css Code:

      def getContent(c, errCode, errMsg, sucMsg, headScript, js_list):
      	Functions.writeToErrorLog(config,user,group,"INFO","Start build response content...")
      	res  = "<!DOCTYPE html>\n" 
      	res += "<html>\n"
      	res += "	<head>\n"
      	res += "		<meta charset=\"UTF-8\" />\n"
      	res += "		<title>Akte</title>\n"
      	res += "		<link rel=\"icon\" href=\"/images/icon.png\" />\n"
      	for css in config['css']:
      		res += "		<link rel=\"stylesheet\" href=\""+css+"\" />\n"
          res += "		<link rel=\"stylesheet\" href=\"" + "/css/akte.css" + "\" />\n"
      	res += "		<style class=\"init\" type=\"text/css\">\n" \
      		"			th, td {\n" \
      		"				white-space: nowrap;\n" \
      		"			}\n" \
      		"			div.dataTables_wrapper {\n" \
      		"				width: 100%;\n" \
      		"				margin: 0 auto;\n" \
      		"			}\n" \
      		"		</style>\n"
      

      Das mit Project und Projekt sind nur Tippfehler die ich hier im Froum gemacht habe. Ich habe im gesamten Dockercontainer inclusive Projekt keine .htaccess Datei

      Ich gehe derzeit davon aus, dass das Problem an meiner Apache Server Konfiguration liegt, das CGI Projekt läuft nämlich auf einem anderen Server. Leider ist das Zeug uralt und so gut dokumentiert, dass ich aus Frust seit heut morgen aus einem vollen 750g Nutella Glas ein fast leeres 750g Nutellaglas gemacht habe. In der README.md des projekts steht übrigens "testtest" :/

      1. Hallo hmm,

        ooookay. Meine Python-Kenntnisse liegen, auf einer Skala von 1-10000, bei ca 0,5. Aber mir scheint, dass Python keine ideale Sprache zum Ausgeben von Webseiten ist, wenn man das ganze HTML per Stringoperation zusammenkleben muss. Geht das nicht eleganter, mit Template-Frameworks? Schnelles googeln ergab diesen Treffer in einem Python-Forum:

        (...) pures cgi geht natürlich, aber das stelle ich mir ziemlich furchtbar vor.
        PHP ist ein Framework zur Erstellung von Webseiten, Python ist es nicht, sondern mit Python und einem Webframework kannst Du Webseiten erstellen.

        Und was Du da machst, ist nackiges Schlangen-CGI. Kein Wunder, dass Du Dich dabei windest und zischst.

        Was ich auch finde (docs.python.org), ist:

        Cross-platform compatibility note: because of the nature of text editors on non-UNIX platforms, it is unwise to use a mixture of spaces and tabs for the indentation in a single source file. It should also be noted that different platforms may explicitly limit the maximum indentation level.

        Und das ist bei Dir nicht sauber. Ich habe deinen Code herunterkopiert und die Einrückung der akte.css Zeile ändert sich. Das ist in Python eine sensible Sache. Es kann natürlich sein, dass das mal wieder der Übertragung ins Forum geschuldet ist; ich gehe davon aus, dass diese Zeile auf den Level des for-Statements gehört.

        Als erstes würde ich mal die ganzen escapten " in ' abändern - soweit das machbar ist. Aber mir scheint, das sind eine Menge. Das dürfte die Lesbarkeit verbessern. Ich würde auch die Stringkonkatenation in der akte.css Zeile entfernen. Das ist unnötige Anführungszeichenakrobatik. Dann sieht's doch gleich besser aus, oder?

        def getContent(c, errCode, errMsg, sucMsg, headScript, js_list):
        	Functions.writeToErrorLog(config,user,group,"INFO","Start build response content...")
        	res  = "<!DOCTYPE html>\n" 
        	res += "<html>\n"
        	res += "	<head>\n"
        	res += "		<meta charset='UTF-8' />\n"
        	res += "		<title>Akte</title>\n"
        	res += "		<link rel='icon' href='/images/icon.png' />\n"
        	for css in config['css']:
        		res += "		<link rel='stylesheet' href='" + css + "' />\n"
        	res += "		<link rel='stylesheet' href='/css/akte.css' />\n"
        	res += "		<style class='init' type='text/css'>\n" \
        		"			th, td {\n" \
        		"				white-space: nowrap;\n" \
        		"			}\n" \
        		"			div.dataTables_wrapper {\n" \
        		"				width: 100%;\n" \
        		"				margin: 0 auto;\n" \
        		"			}\n" \
        		"		</style>\n"
        

        Aber der Knackpunkt ist wohl das for-Statement. Was steht in config['css'] drin? Ist das etwas iterierbares? Oder ist das ein String, den Du erstmal in Teile zerlegen musst? Was hast Du auskommentiert, um den HTTP 500 zu beseitigen? Die for-Zeile und die eingerückte res+=... Zuweisung darunter?

        Rolf

        --
        sumpsi - posui - obstruxi
        1. statt der for schleife kann man nur diese zeile nutzen:

          res += " <link rel='stylesheet' href='/css/akte.css' />\n"

          zum testen.

          der code stammt aus einem GIT und er läuft in anderen systemen, einen fehler im code kann ich im großen und ganzen ausschließen. zumindest fehler die zum nicht ausführen des css führen.

          python wurde wegen pyspark genutzt und weil man aus querys dynamisch webseiten erstellen wollte... irgendwie sowas. eine statische REST API passt nicht, darum wurden python technologien genutzt. kenne ich mich nicht mit aus, ich muss das nur lokal zum laufen bekommen. das einizige problem, was ich noch habe, ist dass die verlinkung der css dateien funktioniert. da dass aber in anderen systemen klappt, liegt der fehler vermutlich in meiner apache konfig.

          unter dem verzeichis /var/www/html kann ich die css datei in einer test index.html datei nutzen.

      2. Moin,

        Der css Code:

        … der eigentlich Python-Code ist, welcher HTML mit CSS als String aus… ja was eigentlich?

        def getContent(c, errCode, errMsg, sucMsg, headScript, js_list):
        	Functions.writeToErrorLog(config,user,group,"INFO","Start build response content...")
        	res  = "<!DOCTYPE html>\n" 
        	res += "<html>\n"
        	res += "	<head>\n"
        	res += "		<meta charset=\"UTF-8\" />\n"
        	res += "		<title>Akte</title>\n"
        	res += "		<link rel=\"icon\" href=\"/images/icon.png\" />\n"
        	for css in config['css']:
        		res += "		<link rel=\"stylesheet\" href=\""+css+"\" />\n"
            res += "		<link rel=\"stylesheet\" href=\"" + "/css/akte.css" + "\" />\n"
        	res += "		<style class=\"init\" type=\"text/css\">\n" \
        		"			th, td {\n" \
        		"				white-space: nowrap;\n" \
        		"			}\n" \
        		"			div.dataTables_wrapper {\n" \
        		"				width: 100%;\n" \
        		"				margin: 0 auto;\n" \
        		"			}\n" \
        		"		</style>\n"
        

        Deine Funktion gibt doch gar nichts zurück. Fehlt da noch ein return res ganz am Ende?

        Und warum verwendest du vor der for-Schleife += und danach einen String mit \ am Zeilenende und warum nicht einheitlich? Bzw. einfacher geht es mit ''' oder """:

        res = """<!doctype html>
        <html>
        <head>
        …
        """
        

        Viele Grüße
        Robert

  2. Oder fehlt da etwas anderes?

    Bei 500er Fehlern immer die Ausgabe des Fehler-Logs betrachten:

    1. Schritt:

    In einer Konsole / Terminal / SSH-Sitzung

    tail -n 0 -f /var/log/apache2/error.log
    

    starten.

    2. Schritt:

    Nicht funktionierende „Webseite“ abrufen.

    3. Schritt:

    Ausgaben hier posten.

    (Die Glaskugel sagt: Vermutlich liegt es an den Rechten.)

    1. Bei CGI-Skripten musst Du als erstes SELBST einen HTTP-Header senden.

      also:

      print ("Content-type: text/html; charset=utf-8\n\n");
      

      Dann den Rest...

      1. Hallo Willi,

        ein fehlender Content-Type Header dürfte den Browser zu merkwürdigen Darstellungen bewegen, aber keinen HTTP 500 erzeugen, oder?

        Rolf

        --
        sumpsi - posui - obstruxi
        1. ein fehlender Content-Type Header dürfte den Browser zu merkwürdigen Darstellungen bewegen, aber keinen HTTP 500 erzeugen, oder?

          Die Antwort ist: "oder".

          Beim Browser kommt nur die Fehlerseite für den 500er an. Das Fehlen des Header fällt nämlich schon dem Apache auf.

          1. Hint: In SelfHTML, Version 8 stand das noch drin… (und ist auch so)

          2. Ich kann das auch erklären:

            Der Server kann sonst nicht wissen, was er sendet. Mit CGI lässt sich alles von Text über diverse Dokument- und Grafiktypen bis hin zu binären Programmen erzeugen. Den Content-typ mit mime-magic festzustellen ist wohl "etwas zu teuer".

            Wenn aber Python als Apache-Modul läuft, dann wird das wohl so ähnlich sein, wie bei PHP: Das Modul wird dann als Voreinstellung den text/html-Typ senden. Die spezielleren CGI-Module des Apachen haben dieses Verhalten auch.

    2. (Die Glaskugel sagt: Vermutlich liegt es an den Rechten.)

      Der Webserver-User (oft: www-data) sollte das Lesen- und das Ausführen-Recht haben.

      Oft hilft etwas wie: chmod 755 datei.cgi

      (Und vergiss den HTTP-Header aus der 2. Vermutung nicht. Wenn das Skriptlein den auf einem anderen System nicht brauchen sollte, dann kann das an der Konfiguration liegen: Gibt es dort eventuell eine versteckte Datei namens „.htaccess“?)

    3. Hallo Raketenwilli,

      Die Glaskugel sagt: Vermutlich liegt es an den Rechten.

      Die AfD ist nicht an allem schuld.

      Aber deine Glaskugel bringt mich auf eine Unklarkeit in hmmms Beschreibung:

      Die Struktur sieht so aus:
      cgi-bin / projekt1 / css / css-files
      cgi-bin / projekt1

      Wenn ich CSS Dateien in den Ordner /var/www/html packe, kann ich sie im Browser aufrufen

      url\cgi-bin\projekt1\css\blabla.css ebenfalls einen 500 Error.

      Wo liegt dieses cgi-bin, relativ zu /var/www/html? Ist cgi-bin ein Unterverzeichnis von/var/www/html? Fehlt dem Webserver-User ggf. das Zugangsrecht zu diesem kompletten Ordner?

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Wo liegt dieses cgi-bin?

        Hm. Ich zeig mal wie ich nachschauen würde:

        user@raspi4 $ cd /etc/apache2/conf-enabled
        user@raspi4:/etc/apache2/conf-enabled $ grep -Rn 'cgi-bin'
        

        Ausgaben:

        localized-error-pages.conf:9:#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
        serve-cgi-bin.conf:11:		ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        serve-cgi-bin.conf:12:		<Directory "/usr/lib/cgi-bin">
        
        1. ich habe leider keinen conf-enabled ordner. der header wird korrekt gesetzt, dass gci file hat 300-400 Zeilen und das Projekt etliche Files. Das projekt läuft in einem anderen System, dh der fehler liegt eher an meinem Dockercontainer bzw meinem Apache Server.

          ich habe auch keine error.log datei die ich grepen könnte.

          hier eine abstraktion meines dockerfiles:

          FROM rhel7:latest
          USER root
          
          RUN yum -y install deltarpm yum-utils --disablerepo=*-eus-* --disablerepo=*-htb-* \
              --disablerepo=*-ha-* --disablerepo=*-rt-* --disablerepo=*-lb-* --disablerepo=*-rs-* --disablerepo=*-sap-*
          
          RUN yum-config-manager --disable *-eus-* *-htb-* *-ha-* *-rt-* *-lb-* *-rs-* *-sap-* > /dev/null
          
          RUN yum update -y && \
              yum install httpd procps-ng -y
          
          # Add configuration file
          RUN export https_proxy=ip1 && \
              export http_proxy=ip2
          
          RUN cd /var/www/cgi-bin/ && \
              mkdir projektname
          
          RUN yum install java-1.7.0-openjdk -y && \
              yum install gcc -y && \
              yum install gcc-c++ -y && \
              yum install openldap-devel -y && \
              yum install python-devel -y
          
          RUN curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py" && \
              python get-pip.py && \
              pip install --upgrade pip
          
          RUN pip install -r /var/req.pip
          
          COPY projektname /var/www/cgi-bin/projektname
          RUN chown root:apache /var/www/cgi-bin/projektname && \
              chmod -R 755 /var/www/cgi-bin/projektname
          EXPOSE 8080
          
          # Start the service
          CMD ["-D", "FOREGROUND"]
          ENTRYPOINT ["/usr/sbin/httpd"]
          
          1. Ich habe auch keine error.log datei die ich grepen könnte.

            Doch hast Du. Nur ist das Zeug vermutlich irgendwo in Deinem Docker-Container. Und falls Du mit dem nicht klarkommst: Installiere das Zeug nativ.

            chown root:apache

            Jetzt bin ich „nicht so der RedHat-Fan“. Aber ich dachte immer, der Benutzer bzw. die Gruppe, unter dem der Apache läuft, heisst da ganz anders…

            1. Jetzt bin ich „nicht so der RedHat-Fan“. Aber ich dachte immer, der Benutzer bzw. die Gruppe, unter dem der Apache läuft, heisst da ganz anders…

              Ich habe nachgeschaut:

              Ohne Docker sind die Logfiles in meiner Red-Hat7 (exakter: CentOS-7-Maschine) unter

              /var/log/httpd

              oder

              /etc/httpd/logs (das ist ein Link zum vorgenannten)

              Der Ordner /etc/httpd enthält die Konfiguration in Weise, wie man sie aus dem vorigen Jahrtausend vom Apache 1 noch kennt.

              Der Benutzer und die Gruppe ist tatsächlich apache. RedHat hat sich schon immer viel Mühe damit gegeben, alles anders - genauer: schlechter, weil komplizierter - zu machen. Insbesondere beim Apache hat das bei immer wieder zu kleinen Wutanfällen geführt.

              Dein Job: Abstrahiere das von mir gelieferte so, dass es auf Deinen Docker-Container passt.

              1. danke, ich konnte jetzt tail -n 0 -f var/log/httpd/error_log machen. da findet er sachen nicht, ich schau mir das genauer an.

                1. Jetzt habe ich aus den logs das hier:

                  AH01215: (8)Exec format error: exec of '/var/www/cgi-bin/images/logo.png' failed, referer: http://localhost/cgi-bin/projekt1/main.cgi
                  
                   End of script output before headers: logo.png, referer: http://localhost/cgi-bin/projekt1/main.cgi
                  

                  AH01215 ist ein DB error?

                  1. End of script output before headers: logo.png, referer: http://localhost/cgi-bin/projekt1/main.cgi

                    Genau wie von Raketenwurstwilli vermutet

                    1. hm, dann würde der folgende codeteil nicht ausgeführt werden:

                      if mod == "bla" or mod == "bla2" or mod == "bla3" or mod == "tollerbutton":
                      	print "Content-type:text/html;charset=utf-8\n\n"	
                      	print c
                      else:
                      	print "Content-type:text/html;charset=utf-8\n\n"
                      	print getContent(c, errCode, errMsg, sucMsg, headScript,js_list)
                      

                      was macht dich so sicher, dass der content-type fehlt?

                      1. und ja, aus diesem python2 projekt muss ich dann auch noch ein python3 projekt machen... ich hab mir dafür schon zwei neue nutella gläser und etwas gegen sodbrennen geholt...

                      2. hm, dann würde der folgende codeteil nicht ausgeführt werden:

                        if mod == "bla" or mod == "bla2" or mod == "bla3" or mod == "tollerbutton":
                        	print "Content-type:text/html;charset=utf-8\n\n"	
                        	print c
                        else:
                        	print "Content-type:text/html;charset=utf-8\n\n"
                        	print getContent(c, errCode, errMsg, sucMsg, headScript,js_list)
                        

                        Hm. Das zeigst Du zum ersten Mal…

                        was macht dich so sicher, dass der content-type fehlt?

                        Naja. Weiter oben steht der sekundäre Fehler:

                        End of script output before headers: logo.png, referer: http://localhost/cgi-bin/projekt1/main.cgi

                        Es ist immer noch offen …

                        1. Wieso '/var/www/cgi-bin/images/logo.png' überhaupt an dieser Stelle existiert, denn das ist FALSCH.

                        2. Wieso der Apache '/var/www/cgi-bin/images/logo.png' als CGI ausführen (lassen) will. Das ist völlig Falsch.

                        3. Wieso '/var/www/cgi-bin/images/logo.png' überhaupt erst als ausführbar markiert wurde. (Sonst käme die Meldung „Exec format error“ nicht.) Getan hast Du das mit chmod -R 755 /var/www/cgi-bin/*… das ist auch FALSCH.

                    2. Raketenwurstwilli

                      Ich gebe hiermit mal meine Unzufriedenheit mit dem Ausdruck bekannt. Auf dem Schulhof hätte ich mit Dir denselben gewischt. Vor 40 Jahren war das völlig adäquat.

                      1. Hallo,

                        man sagt, Namen sind Schall und Rauch. Für andere ist der Name halt wurscht…

                        Gruß
                        Kalk

                    AH01215: (8)Exec format error: exec of '/var/www/cgi-bin/images/logo.png' failed, referer: http://localhost/cgi-bin/projekt1/main.cgi

                    Du versuchst nach einer Weiterleitung von der Datei main.cgi auch noch eine Grafik(!) als CGI-Skript zu verarbeiten. Untersuche, warum die Datei logo.png als CGI-Skript angesehen wird. Ja. Das ist eine Frage der Konfiguration.

                    End of script output before headers: logo.png, referer: http://localhost/cgi-bin/projekt1/main.cgi

                    Es kann sein, dass das an der vorherigen Fehlermeldung liegt, die eventuell ausgesendet wird, es kann aber auch sein, dass das daran liegt, dass der Output gesendet wird.

                    1. (Bitte Linux Grundlagen und Linux-Admin-Grundlagen vor Docker lernen)

                    ich konnte jetzt tail -n 0 -f var/log/httpd/error_log machen.

                    tail -n 0 -f zeigt die letztn n (also 0) Zeilen einer Datei an und wartet, was dazu kommt. Das lässt man im Terminal-Fenster einfach laufen und drückt im Browser auf F5... um nur die neuen Fehlermeldungen zu sehen.

                      1. (Zusatzfrage)

                      AH01215: (8)Exec format error: exec of '/var/www/cgi-bin/images/logo.png' failed, referer: http://localhost/cgi-bin/projekt1/main.cgi

                      Du versuchst nach einer Weiterleitung von der Datei main.cgi auch noch eine Grafik(!) als CGI-Skript zu verarbeiten. Untersuche, warum die Datei logo.png als CGI-Skript angesehen wird. Ja. Das ist eine Frage der Konfiguration.

                      Was hat der Ordner „images“ und die Datei „logo.png“ überhaupt im Ordner /cgi-bin/ verloren? Die gehört da auch nicht hinein!

                      1. ich habe ein projekt der folgenden Form

                        main.cgi

                        images

                        js

                        py

                        css

                        ...

                        ich kann ein paar sachen in den html ordner werfen und die cgi m cgi-bin lassen und gucken was nach anpassen der verlinkungen passiert

                        1. Moin,

                          ich habe ein projekt der folgenden Form

                          main.cgi

                          images

                          js

                          py

                          css

                          ...

                          Und das alles unterhalb von cgi-bin? Wieso?! Bzw. Willi hat dort auch beschrieben, warum das keine gute Idee ist und du hier …

                          ich kann ein paar sachen in den html ordner werfen und die cgi m cgi-bin lassen und gucken was nach anpassen der verlinkungen passiert

                          … statt kann muss schreiben sollst: Was in cgi-bin liegt, wird als CGI-Executable angesehen, „normale“ Ressourcen gehören nach htdocs.

                          Viele Grüße
                          Robert

                          1. Da steht es. (Bei mir in /etc/apache2/mods-available/mime.conf,

                            # To use CGI scripts outside of ScriptAliased directories:

                            # (You will also need to add "ExecCGI" to the "Options" directive.)

                            #AddHandler cgi-script .cgi

                            Hinweis: Üblicherweise zeigt der Skript-Alias auf ein Verzeichnis in welchem nur der Root (oder ein besonderer Benutzer) Schreibrechte hat. Damit die anderen Benutzer nicht das berühmte Mailskript aus dem Skriptarchiv, Jahr 1995, installieren und ich dann 100 statt 30 Spammails am Tag bekomme.

                            1. nach Pfadänderung läuft das, soweit ich das überschauen kann. danke. jetzt kann ich auf python3 upgraden, unittests einbauen, inlineconfig ausbauen...

          2. Hallo,

            der header wird korrekt gesetzt, dass gci file hat 300-400 Zeilen und das Projekt etliche Files. Das projekt läuft in einem anderen System, dh der fehler liegt eher an meinem Dockercontainer bzw meinem Apache Server.

            das heißt also, dass deine Funktion in der Realität etwas zurückgibt?

            Viele Grüße
            Robert

            1. die funktion wird aufgerufen... aber, der quellcode ist als untertisch it der fachabteilung entstanden, ich weiß nicht ob die funktion tatsächlich etwas wiedergibt, allerdings kann ich die anwendung ohne css läufen lassen und lokal benutzen. natürlich könnte die funktion auch nichts sinnvolles tun und das sinnvolle könnte durch andere funktionen getan werden. es gibt auch keinen ansprechpartner zu dem zeug. das einzige was es gibt, ist eine umgebung auf der das zeug läuft, sollte der dazugehörige storage gelöscht werden, könnte es aber eventuell auch da nichtmehr laufen. da die anwendung so wie sie ist benötigt wird muss ich zusehen das ich das lokal mit css zum laufen bringe.... was die logs an geht, ein find -name error.log findet schonmal nichts

              1. achso, die funktion ist deutlich läner und verfügt über ein return. da hat nur jemand leerzeilen reingehauen, darum habe ich das nicht gesehen

            2. das heißt also, dass deine Funktion in der Realität etwas zurückgibt?

              Hätte auch sein können wie in Perl. Da kannst auch einfach eine Variable zuweisen. Wenn es das letzte ist, was in der Funktion notiert wurde, ist das in Perl implizit auch ein return. Gruselig, ist aber so.

              1. Hallo,

                das heißt also, dass deine Funktion in der Realität etwas zurückgibt?

                Hätte auch sein können wie in Perl. Da kannst auch einfach eine Variable zuweisen. Wenn es das letzte ist, was in der Funktion notiert wurde, ist das in Perl implizit auch ein return. Gruselig, ist aber so.

                Deswegen lautet das Motto von Python "explicit is better than implicit".

                Viele Grüße
                Robert

                1. Deswegen lautet das Motto von Python "explicit is better than implicit".

                  Wenn mir Einrückungen vorgeschrieben werden, ist mit das etwas zu „explicit“ ;-)

                  1. Wenn mir Einrückungen vorgeschrieben werden, ist mit das etwas zu „explicit“ ;-)

                    Die Einrückungen zeigen die Blöcke an. In anderen Programmiersprachen sind die zwar freiwillig, dafür musst Du aber noch etwas anders notieren:

                    if [ test ]; then
                      echo "Es ist!"
                    fi
                    
                    if ( test ) {
                      echo "Es ist!";
                    }
                    
                    if test:
                      print("Es ist!");
                    
                    
                2. Gruselig, ist aber so.

                  Larry Wall began work on Perl in 1987, while working as a programmer at Unisys

                  1987, also vor 33 Jahren hat man noch nicht viel darüber gewusst, wie man Programmiersprachen syntaktisch so „konstruiert”, dass die Notationen dann auch lesbar sind. Perl ist geradezu das Paradebeispiel dafür geworden, wie man das nicht tun sollte. (Allein das Handling von Arrays ist schlicht und einfach fürchterlich!)

                  1. Hallo Raketenwilli,

                    vor 33 Jahren hat man noch nicht viel darüber gewusst, wie man Programmiersprachen syntaktisch so „konstruiert”, dass die Notationen dann auch lesbar sind.

                    Mrs. Admiral Hopper ist anderer Meinung 😉. Joe Pulitzer auch. Wenn auch unbeabsichtigt.

                    Dr. Iverson liefert dagegen den schlagenden Beweis für die Richtigkeit deiner These. In einer Zeile!. Dennis wollte es nachmachen, es ist aber nicht ganz gelungen.

                    Rolf

                    --
                    sumpsi - posui - obstruxi