Perl-Gast: Funktionsaufrufe in HERE-Dokumenten...?

Hallo!

Wie ist es möglich, Funktionen/Subroutinen innerhalb von HERE-Dokumenten in Perl aufzurufen?

Beispiel:

print <<HTML;
Hier folgt etwas <b>HTML</b>, etc...
<p>
Deine IP: $ENV{REMOTE_ADDR}
<p>
Die Uhrzeit:   Zeit()
<p>
Noch ein bisschen Text...
HTML

Es ist mir bekannt, dass in diesem Beispiel Variablen, Arrays, etc. interpoliert, also eingefügt werden (siehe $ENV{REMOTE_ADDR}). Ich habe jedoch schon versucht, auf diese Art und Weise Funktionen aufzurufen und im HERE-Dokument ausgeben zu lassen. Dies funktioniert jedoch nicht. Ich muss dann immer vor dem HERE-Dokument das Ergebnis der Funktion in einer Variablen zwischenspeichern oder das HERE-Dokument unterbrechen, die Funktion mit 'print' ausgeben und dann das HERE-Dokument fortführen.

Hat jemand eine Idee?

Vielen Dank im Vorraus.

  1. hallo,

    Wie ist es möglich, Funktionen/Subroutinen innerhalb von HERE-Dokumenten in Perl aufzurufen?

    Naja, eigentlich gar nicht.

    Es ist mir bekannt, dass in diesem Beispiel Variablen, Arrays, etc. interpoliert, also eingefügt werden (siehe $ENV{REMOTE_ADDR}). Ich habe jedoch schon versucht, auf diese Art und Weise Funktionen aufzurufen und im HERE-Dokument ausgeben zu lassen. Dies funktioniert jedoch nicht.

    Doch, aber mit unnötigen Verrenkungen. Du kannst die Ausgabe deiner Subroutine in eine Variable packen und dann den Inhalt der Variablen im HERE-Dokument ausgeben lassen.

    Ich muss dann immer vor dem HERE-Dokument das Ergebnis der Funktion in einer Variablen zwischenspeichern oder das HERE-Dokument unterbrechen, die Funktion mit 'print' ausgeben und dann das HERE-Dokument fortführen.

    Da hast du doch schon die einzige mögliche Vorgehensweise selber gefunden. Die Möglichkeit, HERE-Dokumente zu notieren, wurde ja speziell dazu erfunden, daß man eben _keine_ zwischenzeitlichen Programmaufrufe starten will.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Hey,

      gar nicht

      gar nicht gibt's nicht. Du und Struppi gewöhnt euch besser diese zugeständnislosen Behauptungen ab - nur weil man etwas nicht kennt, heißt das noch lange nicht, das es nicht existiert.

      Man kann nämlich sehr wohl beliebige Ausdrücke in Strings interpolieren, also auch Funktionsaufrufe in Heredocs.

        
      #!perl -T  
      use strict;  
      use diagnostics;  
        
      print <<"";  
      Es ist jetzt @{[scalar localtime]}.  
      1 plus 1 ist @{[1+1]}.  
        
      #  
      
      
      --
      水-金-地-火-木-土-天-海-冥
      1. h,

        gar nicht
        gar nicht gibt's nicht. Du und Struppi gewöhnt euch besser diese zugeständnislosen Behauptungen ab

        Und du gewöhnst dir bitte eine korrekte Zitationsweise an - ich habe "eigentlich gar nicht" geschrieben.

        Man kann nämlich sehr wohl beliebige Ausdrücke in Strings interpolieren, also auch Funktionsaufrufe in Heredocs.

        Darauf war der OP schon selbst gekommen, und ich habe es lediglich bekräftigt.

        use diagnostics;

        "diagnostics" ist ganz nett, verwirrt hier aber eher, weil: "This module extends the terse diagnostics normally emitted by both the perl compiler and the perl interpreter (from running perl with a -w switch or "use warnings"), augmenting them with the more explicative and endearing descriptions found in perldiag. Like the other pragmata, it affects the compilation phase of your program rather than merely the execution phase."

        print <<"";
        Es ist jetzt @{[scalar localtime]}.
        1 plus 1 ist @{[1+1]}.

        Wenn man das auch noch wirklich als korrekten Code schreibt, funktioniert das natürlich, illustriert aber nichts anderes als meine Aussage. Es geht bloß laut OP um ungefähr so etwas:

          
        print << Ende;  
        <html><head><title>ups</title></head>  
        <body>  
        <h1>Super!</h1>  
        <p>Sie haben folgenden Preis gewonnen:  
        sub preisausschreiben {  
           if {[richtige Antwort => Gutschein über 100 Euro]}  
           elseif {[Juriy gut gelaunt => Gutschein über lebenslange Monatsrente von (Betrag bitte einsetzen) Euro]}  
           else {[gehen Sie nicht über Los, aber direkt ins Gefängnis]}  
        }  
        </p>  
        ENDE  
        
        

        Da kann man zappeln, wie man will, das klappt nicht.

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
        1. hallo,

          ich darf, da es ja um Korrektheit im Code geht, die beiden kleinen Tippfehler rasch korrigieren:

          print << Ende;
          <html><head><title>ups</title></head>
          <body>
          <h1>Super!</h1>
          <p>Sie haben folgenden Preis gewonnen:
          sub preisausschreiben {
             if {[richtige Antwort => Gutschein über 100 Euro]}
             elsif {[Jury gut gelaunt => Gutschein über lebenslange Monatsrente von (Betrag bitte einsetzen) Euro]}
             else {[gehen Sie nicht über Los, aber direkt ins Gefängnis]}
          }
          </p>
          ENDE

            
          ;-)  
            
            
          Grüße aus Berlin  
            
          Christoph S.
          
          -- 
          [Visitenkarte](http://community.de.selfhtml.org/visitenkarten/view.php?key=26)  
            
          ss:| zu:) ls:& fo:) va:) sh:| rl:|
          
        2. use diagnostics;
          "diagnostics" ist ganz nett, verwirrt hier aber eher, weil: "This module extends the terse diagnostics normally emitted by both the perl compiler and the perl interpreter (from running perl with a -w switch or "use warnings"), augmenting them with the more explicative and endearing descriptions found in perldiag. Like the other pragmata, it affects the compilation phase of your program rather than merely the execution phase."

          Nee, sorry Christoph, aber das diagnostics-Pragma ist genau für die Entwicklungsphase eines Scriptes gedacht, ähnlich wie das warnings-Pragma. Aus dem von dir zitierten Ausschnitt ist keineswegs zu erkennen, warum du diagnostics für verwirrend hältst, ist es doch genau das Werkzeug, um in der Entwicklungsphase bei Warnungen nicht ewig in perldiag suchen zu müssen. Und in der Produktivphase hat use diagnostics m.E. im Script genausowenig verloren wie use warnings.

          Siechfred

          --
          Ich bin strenggenommen auch nur interessierter Laie. (molily)
          1. hallo Torsten,

            Aus dem von dir zitierten Ausschnitt ist keineswegs zu erkennen, warum du diagnostics für verwirrend hältst

            Nicht grundsätzlich, sondern "hier" - das bezieht sich auf den Kontext der Frage im Ausgangsposting.

            in der Produktivphase hat use diagnostics m.E. im Script genausowenig verloren wie use warnings.

            Das steht außer Frage.

            Grüße aus Berlin

            Christoph S.

            --
            Visitenkarte
            ss:| zu:) ls:& fo:) va:) sh:| rl:|
      2. gar nicht
        gar nicht gibt's nicht. Du und Struppi gewöhnt euch besser diese zugeständnislosen Behauptungen ab ...

        nö.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
  2. Hallo!

    Danke für eure Hilfe. Ich werde eure Codes ausprobieren, euren Antworten kann ich entnehmen, dass es anders nicht zu gehen scheint.

    Nur zum bessere Verständnis: Ich meine soetwas hier:

    » sub tier
    » {
    »      return "Hund";
    » }
    »
    » print <<HTML;
    » <center>
    » Du bist ein tier().
    » </center>
    » HTML

    Einer von euch schreibt auch dies hier:
    » print <<"";
    » Mein HERE-Dokument...
    »
    Geht das? Kann man den Tag (bei mir HTML) auch weglassen?? Oder was hat es damit auf sich?
    Ihr müsst wissen: Ich habe eine sehr lange Perl-Pause hinter mir und habe einiges verlernt. Ich bringe es mir gerade neu bei, beim Aufbau meiner neuen Homepage.
    Bin für alles neue offen.

    Da der Thread für mich so weit geklärt ist habe ich noch eine kleine Frage, für die ich nicht extra ein neues Thema erstelllen möchte:
    Ich benutze wenn möglich "use strict;". Wie kann ich im Hauptskript definierte Variablen in einem REQUIRE-Skript abrufen? Mir wird immer ein Fehler gemeldet. Zur Zeit Definere ich die Variable im Hauptskript mit "our $variable=25" und definiere sie im REQUIRE-Skript nochmal, aber ohne neue Wertzuweisung.
    Geht das auch einfacher?

    Ich danke euch sehr für eure Hilfe!

    1. Nur zum bessere Verständnis: Ich meine soetwas hier:
      [...]

      Klar geht das, siehe die Antwort von den drei Fragezeichen:

      use strict;  
      use diagnostics;  
        
      sub hund { return 'Wau!'; }  
      my $cat = 'Miau';  
        
      print <<"";  
      Ein Hund macht @{[hund()]}.  
      Eine Katze macht $cat.
      

      (siehe perlop und perlref, dort den letzten Absatz)

      » print <<"";
      » Mein HERE-Dokument...
      Geht das? Kann man den Tag (bei mir HTML) auch weglassen?? Oder was hat es damit auf sich?

      Man kann schreiben was man will, heredoc bedeutet nicht zwangsläufig HTML, sondern simpel gesagt nur, dass jetzt umfangreiche Textausgaben ausgegeben werden sollen, ohne jedesmal print davorschreiben zu müssen.

      Ich benutze wenn möglich "use strict;". Wie kann ich im Hauptskript definierte Variablen in einem REQUIRE-Skript abrufen? Mir wird immer ein Fehler gemeldet. Zur Zeit Definere ich die Variable im Hauptskript mit "our $variable=25" und definiere sie im REQUIRE-Skript nochmal, aber ohne neue Wertzuweisung.

      Ich verstehe noch nicht so ganz, was du tun willst, und verweise prophylaktisch auf http://perldoc.perl.org/functions/my.html und http://perldoc.perl.org/functions/our.html.

      Siechfred

      --
      Ich bin strenggenommen auch nur interessierter Laie. (molily)
    2. hallo,

      Nur zum bessere Verständnis: Ich meine soetwas hier:

      sub tier
      {
           return "Hund";
      }
      »
      print <<HTML;
      <center>
      Du bist ein tier().
      </center>
      HTML
      Einer von euch schreibt auch dies hier:
      print <<"";
      Mein HERE-Dokument...
      Geht das? Kann man den Tag (bei mir HTML) auch weglassen?

      Jaein. Wenn zuvor schon anderer HTML-Code ausgegeben wurde und das nun bloß noch daruntergestellt werden soll, ist es möglich. Allerdings würde in _diesem_ Beispiel entweder ein Fehler gemeldet oder wenigstens nicht das Erwünschte ausgegeben. Nur wenn du deinen Begrenzer, also hier "HTML" in doppelte Anführungszeichen setzt, werden Variablen interpoliert.

      Da der Thread für mich so weit geklärt ist habe ich noch eine kleine Frage, für die ich nicht extra ein neues Thema erstelllen möchte:

      Das ist völlig richtig, sonst würde dich auch jemand wegen "Doppelposting" anmeckern.

      Ich benutze wenn möglich "use strict;". Wie kann ich im Hauptskript definierte Variablen in einem REQUIRE-Skript abrufen?

      Das hängt davon ab, an welcher Stelle im Script "require" steht.

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
      1. » Das hängt davon ab, an welcher Stelle im Script "require" steht.
        OK, also folgendes Beispiel:

        use strict;
        my $zahl=5;

        require "rechnung.cgi";

        print "Sie müssten nun SECHS sehen.";

        RECHNUNG.CGI:

        use strict;
        $zahl++;
        print $zahl;

        Das geht nicht. Ich erhalte immer den Fehler, dass ich gefälligst in RECHNUNG.CGI die Variable "zahl" definieren soll.

        Um im REQUIRE-Skript (das REQUIRE steht i. d. R. *NACH* der Variablen-deklaration) mit der Varaible rechnen zu können, müss ich in beiden Skripten "our $zahl;" schreiben.

        1. hallo,

          OK, also folgendes Beispiel:

          use strict;
          my $zahl=5;

          require "rechnung.cgi";

          print "Sie müssten nun SECHS sehen.";

          RECHNUNG.CGI:

          use strict;
          $zahl++;
          print $zahl;
          Das geht nicht.

          Nein, kann es auch nicht. Mal abgesehen davon, daß dein Beispielcode - naja, sagen wir mal, er sei unvollständig. Allerdings wird damit ungefähr deutlich, was du machen möchtest. Und das macht die Beantwortung keineswegs leichter.

          Das Ganze hat mit dem Konzept der Namensräume zu tun und mit dem grundlegenden Programmablauf. Dein "Hauptscript" eröffnet einen solchen Namensraum ("main"), in dem dann auch die vom Hauptscript verwendeten Variablen gehalten werden. An der Stelle, an der du "require" notierst, wird aber dieser Namensraum verlassen, da ja jetzt ein völlig neues Script abgearbeitet wird. Das hat (meist) einen anderen Namensraum und bekommt so gut wie gar nichts "übergeben". Es ist ein eigenständiges Programm, was abgearbeitet wird, und sobald alles erledigt ist, kehrt der Perl-Interpreter wieder zum Hauptscript zurück, also auch an die Stelle, an der ihm der vom Hauptscript eröffnete Namensraum zur Verfügung steht. Damit gilt auch keine Variable mehr, die in dem eingebundenen Script eventuell mit Werten befüllt wurde.
          Es gibt ein paar Tricks, mit denen man das in deinem Sinn nutzen kann.

          Um im REQUIRE-Skript (das REQUIRE steht i. d. R. *NACH* der Variablen-deklaration) mit der Varaible rechnen zu können, müss ich in beiden Skripten "our $zahl;" schreiben.

          Zwar ist our eine kluge Wahl (gegenüber dem veraltenden Pragma "vars"). behebt aber dein Problem nicht.

          Ich verfechte ganz gern die Ansicht, daß man anstelle von "require" heute lieber use einsetzen sollte. Damit stehst du allerdings vor dem Problem, daß ein "use rechnung.cgi" nicht funktionieren wird, weil "use" ein Modul einbinden möchte - also eventuell "rechnung.pm". Aber schließlich sollte es kein Problem sein, bei Bedarf ein eigenes Modul zu schreiben.

          Der Vorteil für deinen Programmablauf besteht darin, daß Module sofort kompiliert werden und alles, was in ihnen definiert ist, für den Rest der Script-Laufzeit zur Verfügung steht. Wenn du für eine Perl-Applikation also eine Menge Variablen brauchst, ist es sinnvoll, die in einem Modul zu definieren. Wird das dann mit "use" ins Hauptscript übernommen, stehen sie zur Verfügung, und du ersparst dir weitere Deklarationen.

          Die ganze Geschichte ist weit komplexer und vielschichtiger, da hat sich von Perl 5.6 zu Perl 5.8.8 (das ist die aktuelle Version) auch einiges verändert (worauf die aktuelle online-Version von SELFHTML übrigens noch nicht eingehen konnte und auch die nächste wird es vermutlich noch nicht in befriedigendem Maß tun), so daß man bei scheinbar unlösbaren Problemen auch noch schauen muß, welche Version des Perl-Interpreters zur Verfügung steht. Man kann allenfalls empfehlen, für ein mit "require" eingebundenes Script nur sehr einfache Aufgaben (beispielsweise die Abarbeitung von HERE-Dokumenten) ohne allzuviele Variablen vorzusehen oder besser noch ganz darauf zu verzichten und die gewünschte Perl-Applikation gleich aus mehreren eigenen Modulen zusammenzusetzen.

          Grüße aus Berlin

          Christoph S.

          --
          Visitenkarte
          ss:| zu:) ls:& fo:) va:) sh:| rl:|
          1. Das Ganze hat mit dem Konzept der Namensräume zu tun und mit dem grundlegenden Programmablauf. Dein "Hauptscript" eröffnet einen solchen Namensraum ("main"), in dem dann auch die vom Hauptscript verwendeten Variablen gehalten werden. An der Stelle, an der du "require" notierst, wird aber dieser Namensraum verlassen, da ja jetzt ein völlig neues Script abgearbeitet wird. Das hat (meist) einen anderen Namensraum und bekommt so gut wie gar nichts "übergeben". Es ist ein eigenständiges Programm, was abgearbeitet wird, und sobald alles erledigt ist, kehrt der Perl-Interpreter wieder zum Hauptscript zurück, also auch an die Stelle, an der ihm der vom Hauptscript eröffnete Namensraum zur Verfügung steht. Damit gilt auch keine Variable mehr, die in dem eingebundenen Script eventuell mit Werten befüllt wurde.

            Das stimmt nicht (da irrt auch selfhtml). Beide Dateien haben den Namensraum main, allerdings wird durch my die Reichweite der einen Variabel auf den Block bzw. hier auf die Datei begrenzt. http://perldoc.perl.org/functions/my.html

            Zwar ist our eine kluge Wahl (gegenüber dem veraltenden Pragma "vars"). behebt aber dein Problem nicht.

            wieso nicht?

            Ich verfechte ganz gern die Ansicht, daß man anstelle von "require" heute lieber use einsetzen sollte.

            Das ist Quatsch use und require hat nichts mit heutzutage zu tun bei haben ihre speziellen Aufgabenbereiche. Es ist durchaus üblich zur Laufzeit Module mit require einzubinden.

            Der Vorteil für deinen Programmablauf besteht darin, daß Module sofort kompiliert werden und alles, was in ihnen definiert ist, für den Rest der Script-Laufzeit zur Verfügung steht. Wenn du für eine Perl-Applikation also eine Menge Variablen brauchst, ist es sinnvoll, die in einem Modul zu definieren. Wird das dann mit "use" ins Hauptscript übernommen, stehen sie zur Verfügung, und du ersparst dir weitere Deklarationen.

            Nicht ohne Exporter

            ....Man kann allenfalls empfehlen, für ein mit "require" eingebundenes Script nur sehr einfache Aufgaben (beispielsweise die Abarbeitung von HERE-Dokumenten) ohne allzuviele Variablen vorzusehen oder besser noch ganz darauf zu verzichten und die gewünschte Perl-Applikation gleich aus mehreren eigenen Modulen zusammenzusetzen.

            Ob require oder use spielt im zusammenhang mit Modulen keine Rolle

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. hallo Struppi,

              (da irrt auch selfhtml).

              Einen zarten Hinweis dieser Art habe ich ja schon gegeben.

              Ich verfechte ganz gern die Ansicht, daß man anstelle von "require" heute lieber use einsetzen sollte.
              Das ist Quatsch use und require hat nichts mit heutzutage zu tun bei haben ihre speziellen Aufgabenbereiche. Es ist durchaus üblich zur Laufzeit Module mit require einzubinden.

              "require" kann immer noch andere Scripts einbinden, die keine "Module" sind, "use" kann das nicht. Aber genau da liegt das Problem, daß du mit dem Gebrauch von "require" erst zu ein paar Tricks greifen mußt, um zwischen Hauptscript und eingebundenem Script Variablen und/oder Subroutinen austauschen zu können.

              [...] Wird das dann mit "use" ins Hauptscript übernommen, stehen sie zur Verfügung, und du ersparst dir weitere Deklarationen.
              Nicht ohne Exporter

              Doch, auch ohne. Ich habe sowas in Betrieb.

              Grüße aus Berlin

              Christoph S.

              --
              Visitenkarte
              ss:| zu:) ls:& fo:) va:) sh:| rl:|
              1. Ich verfechte ganz gern die Ansicht, daß man anstelle von "require" heute lieber use einsetzen sollte.
                Das ist Quatsch use und require hat nichts mit heutzutage zu tun bei haben ihre speziellen Aufgabenbereiche. Es ist durchaus üblich zur Laufzeit Module mit require einzubinden.

                "require" kann immer noch andere Scripts einbinden, die keine "Module" sind, "use" kann das nicht. Aber genau da liegt das Problem, daß du mit dem Gebrauch von "require" erst zu ein paar Tricks greifen mußt, um zwischen Hauptscript und eingebundenem Script Variablen und/oder Subroutinen austauschen zu können.

                Was für Tricks?
                Der Hautpunterschied zwischen use und require ist, das use während der Übersetzungsphase ausgeführt wird und require zur Laufzeit. Darüberhinaus ruft use import() auf sofern vorhanden.
                Ansonsten gibt es Unterschiede welche Dateien eingebunden werden bzw. wie sie heißen dürfen und wie und wo danach gesucht wird, aber ein Unterschied bei Variabeln ist mir nicht bekannt.

                [...] Wird das dann mit "use" ins Hauptscript übernommen, stehen sie zur Verfügung, und du ersparst dir weitere Deklarationen.
                Nicht ohne Exporter

                Doch, auch ohne. Ich habe sowas in Betrieb.

                ???

                Struppi.

                --
                Javascript ist toll (Perl auch!)
                1. Aber genau da liegt das Problem, daß du mit dem Gebrauch von "require" erst zu ein paar Tricks greifen mußt, um zwischen Hauptscript und eingebundenem Script Variablen und/oder Subroutinen austauschen zu können.

                  Das ist nicht ganz richtig! Subroutinen kann ich problemlos austauschen.

                  Meine "index.cgi" hat mindestens 4 oder 5 mal REQUIRE verwendet, um andere Module aufrufen zu können. Ich kann von dedem Skript aus eine Subroutine aufrufen, sogar, wenn diese Subroutine in "index.cgi" oder in einem anderen REQUIRE-Modul definiert wurde!

                  Und genau das klappt mit Variablen leider nicht.

                  1. Meine "index.cgi" hat mindestens 4 oder 5 mal REQUIRE verwendet, um andere Module aufrufen zu können. Ich kann von dedem Skript aus eine Subroutine aufrufen, sogar, wenn diese Subroutine in "index.cgi" oder in einem anderen REQUIRE-Modul definiert wurde!

                    Und genau das klappt mit Variablen leider nicht.

                    doch kannst du, aber nur wenn du unsauber programmierst.

                    das ganze Problem ist eine Verständnissfrage, was tut require was tut use, was ist eine Modul oder ein package, was genau ist Wirkung von my, our, was sind namespaces, wie kann man Variabeln über Pakete hinweg sichtbar machen, sollte man das tun, usw. usf.

                    Mit diesen Fragen solltest du dich auseinandersetzen, bisher gehst du immer einen Schritt und wenn du abgestürzt bist schaust du nach unten, dann ist es zu spät.

                    Das Konzept von Perl mit den Modulen, beinhaltet auch verschiedene Pakete, also nicht einfach use Modul; und dann callFunction(); sondern die Module können und sollen in verschiedene Namensräume getrennt werden. Darauf zugreifen kannst du dann über verschiedene Wege, entweder du importierst diese Funktionen oder du rufst sie qualifiziert auf über Modul::callFunction(), das gleiche gilt in etwa für Variabeln, es sei denn, sie sind als my deklariert, dann stehen sie nur in dem jeweiligen "Scope" (Also Gültigkeitsbereich) zu Verfügung und das soll auch  so sein, wenn du das nciht möchtest, hast du auch mehrere Möglichkeiten. Entweder du arbeitest mit globalen Variablen die du vollqualifiziert ansprichst z.b. $main::var oder du exportierst sie mit Exporter oder du benutzt ein Modul, mit dem du Initialisierungsvariabeln benutzen kannst, dass ist wohl auch das worauf du hinaus willst.

                    Aber was du wirklich willst, läßt sich so nicht sagen, da weder dein Konzept noch dein Ziel erkennbar ist.

                    Struppi.

                    --
                    Javascript ist toll (Perl auch!)
                    1. Aber was du wirklich willst, läßt sich so nicht sagen, da weder dein Konzept noch dein Ziel erkennbar ist.

                      Ja, dessen bin ich mir leider bewusst. Ich code am liebsten gleich imemr drauf los, obwohl ich möglichst imerm versuche, ein System in meine Webseite reinzubrignen. Bisher ist mir das auch gut gelungen, ich bin zufrieden damit.

                      Könntest du mir netterweise einen Link geben (vielleicht perldoc?), wo ich das mit Modul::callFunction() und $main::VAR nochmal nachlesen könnte?

                      Danke für deine guten Erklärungen!

                      1. Könntest du mir netterweise einen Link geben (vielleicht perldoc?), wo ich das mit Modul::callFunction() und $main::VAR nochmal nachlesen könnte?

                        ehrlich gesagt ich weiß nicht wo das steht. Das mit den Paketen gibt es so in vielen Programmiersprachen, mir ist das zuerst in C++ über dem Weg gelaufen. Ist aber keine hohe Kunst.

                        use strict;  
                        package Test;  
                          
                        $Test::var = 1;  
                          
                        sub incVar  
                        {  
                        $Test::var++;  
                        $main::var++;  
                        }  
                          
                        package main;  
                        use strict;  
                        $main::var = 10;  
                          
                        print "main::var=$main::var\n";  
                        print "Test::var=$Test::var\n";  
                          
                        Test::incVar();  
                          
                        print "main::var=$main::var\n";  
                        print "Test::var=$Test::var\n";  
                        
                        

                        schön ist das allerdings nicht.

                        Struppi.

                        --
                        Javascript ist toll (Perl auch!)
  3. Dein "Hauptscript" eröffnet einen solchen Namensraum ("main"), in > dem dann auch die vom Hauptscript verwendeten Variablen gehalten
    werden. An der Stelle, an der du "require" notierst, wird aber
    dieser Namensraum verlassen

    Aha! Das ist eine sehr gute Erklärung! Das habe ich verstanden, leider scheint es durch Struppi widerlegt worden zu sein.

    Bei meinem Beispiel ocde habe ich übrigens "unwichtiges" bewusst weggelassen, etwas die 1; am Ende de REQUIRE-Skriptes.

    Ich würde gern USE verwenden, habe jedoch Schwierigkeiten:
    Ich ändere die Module oft und mus sie wieder neu schreiben.
    Perl meldet immer Fehler, weil ich meine Module nicht in @INC speichern kann. Und bei USE kann ich leider keine relativen Pfade angeben.

    1. hallo,

      Aha! Das ist eine sehr gute Erklärung! Das habe ich verstanden, leider scheint es durch Struppi widerlegt worden zu sein.

      Nein, Struppi hat mich nicht vollständig widerlegt. Ich habe allerdings mit Bedacht angegeben, daß diese ganze Sache wesentlich komplexer und vielschichtiger ist als ich sie skizziert habe. Und Struppi hat sich etwas von dem als Argumentationshilfe herangezogen, was eben in diese "Komplexität" gehört.

      Bei meinem Beispiel ocde habe ich übrigens "unwichtiges" bewusst weggelassen, etwas die 1; am Ende de REQUIRE-Skriptes.

      Sowas solltest du niemals tun. Das Forum ist auf Beispielcode angewiesen und darin wird dann nach möglichen Fehlern gesucht, um sie beheben zu können. Die fehlende "1;" ist dabei zweitrangig. Viel wichtiger wäre, um überhaupt eine Ausgabe am Bildschirm erreichen zu können, ein
        print "Content-type: text/html\n\n";

      • falls es HTML sein soll, oder ein
          print "Content-type: text/plain";
      • falls es ausreicht, nur eine Textausgabe zum Testen zu erzeugen.

      Ich würde gern USE verwenden, habe jedoch Schwierigkeiten:
      Ich ändere die Module oft und mus sie wieder neu schreiben.

      Genau das ist ein "dafür"-Argument, dein Perl-Projekt modular aufzubauen.

      Perl meldet immer Fehler, weil ich meine Module nicht in @INC speichern kann.

      Wieso kannst du das nicht?

      Grüße aus Berlin

      Christoph S.

      --
      Visitenkarte
      ss:| zu:) ls:& fo:) va:) sh:| rl:|
    2. Dein "Hauptscript" eröffnet einen solchen Namensraum ("main"), in > dem dann auch die vom Hauptscript verwendeten Variablen gehalten
      werden. An der Stelle, an der du "require" notierst, wird aber
      dieser Namensraum verlassen
      Aha! Das ist eine sehr gute Erklärung! Das habe ich verstanden, leider scheint es durch Struppi widerlegt worden zu sein.

      Ja hat er, die Variabeln sind solange du nicht mit einem anderen arbeitest alle im Namensraum main::

      Ich würde gern USE verwenden, habe jedoch Schwierigkeiten:
      Ich ändere die Module oft und mus sie wieder neu schreiben.
      Perl meldet immer Fehler, weil ich meine Module nicht in @INC speichern kann. Und bei USE kann ich leider keine relativen Pfade angeben.

      Du solltest dir das mit den Modulen/Packages mal genauer ansehn. Du kannst mit use lib das Verzeichniss erweitern wo use sucht.

      Struppi.

      --
      Javascript ist toll (Perl auch!)