Schlumpf: Includes in Perl

Guten Morgen allerseits,

In vielen Programmiersprachen wie z.B. Pascal oder C gibt es die Möglichkeit, Quelltexte aus einer anderen Quelltextdatei zu includen und somit einen Quelltext zentral für mehrere Programme zu nutzen. In HTML geht das ja auch, indem ich eine *.js-Datei in die HTML-Seite inbinde.
Geht das auch in Pearl. Ich habe zwar etaws über vorcompilierte (?) Module gelesen, die dann auch in bestimmte Verzeichnisse installiert werden müssen, aber das wollte ich eigentlich nicht. Ich wollte meine Konstanten mal zusammenfassen und in einer zentralen "cfg"-Datei unterbringen, die dann z.B. mit "#include<config.cfg>" oder so eingebunden wird, so daß ich dann bei Änderungen einfach diese Datei (die möglichst auch noch in einem beliebigen verzeichnis liegen sollte) überschreiben kann.

vielen Dank

  1. Und guten Abend meinerseits ;)

    Guten Morgen allerseits,

    In vielen Programmiersprachen wie z.B. Pascal oder C gibt es die Möglichkeit, Quelltexte aus einer anderen Quelltextdatei zu includen und somit einen Quelltext zentral für mehrere Programme zu nutzen. In HTML geht das ja auch, indem ich eine *.js-Datei in die HTML-Seite inbinde.
    Geht das auch in Pearl.

    Wenn du Perl meinst, ja ;)

    Ich habe zwar etaws über vorcompilierte (?) Module gelesen,

    Perl wird nicht kompiliert!? - Wo hast du das gelesen?

    die dann auch in bestimmte Verzeichnisse installiert werden müssen, aber das wollte ich eigentlich nicht. Ich wollte meine Konstanten mal zusammenfassen und in einer zentralen "cfg"-Datei unterbringen,

    Was für Konstanten?

    die dann z.B. mit "#include<config.cfg>" oder so eingebunden wird, so daß ich dann bei Änderungen einfach diese Datei (die möglichst auch noch in einem beliebigen verzeichnis liegen sollte) überschreiben kann.

    Dein Freund heisst 'require'

    perldoc -f require

    gibt Auskunft ;)

    Viele Grüsse und gute Nacht

    Philipp

  2. Halihallo nochmals

    In vielen Programmiersprachen wie z.B. Pascal oder C gibt es die Möglichkeit, Quelltexte aus einer anderen Quelltextdatei zu includen und somit einen Quelltext zentral für mehrere Programme zu nutzen. In HTML geht das ja auch, indem ich eine *.js-Datei in die HTML-Seite inbinde.
    Geht das auch in Pearl. Ich habe zwar etaws über vorcompilierte (?) Module gelesen, die dann auch in bestimmte Verzeichnisse installiert werden müssen, aber das wollte ich eigentlich nicht. Ich wollte meine Konstanten mal zusammenfassen und in einer zentralen "cfg"-Datei unterbringen, die dann z.B. mit "#include<config.cfg>" oder so eingebunden wird, so daß ich dann bei Änderungen einfach diese Datei (die möglichst auch noch in einem beliebigen verzeichnis liegen sollte) überschreiben kann.

    </?m=90982&t=16249> lässt Grüssen ;-((

    Öm. Mit überschreiben von Sourcecode wäre ich mal lieber vorsichtig und würde zu einer anderen Lösung tendieren... Das überschreiben/bearbeiten von Sourcecode ist in den meisten Fällen eher ungeeignet.
    Was für Konstanten speicherst du? - Kann man das nicht irgendwie in eine "ganz normale" andere Datei unterbringen?

    cfg-Datei schreit mir nach sowas:

    name1=value1
    name2=value2
    ...

    sowas lässt sich (und sollte sogar) ganz anders handhaben, als mit require und Sourceinbindungen zu arbeiten...

    Viele Grüsse

    Philipp

    1. Was für Konstanten speicherst du? - Kann man das nicht irgendwie in eine "ganz normale" andere Datei unterbringen?

      cfg-Datei schreit mir nach sowas:

      name1=value1
      name2=value2
      ...

      sowas lässt sich (und sollte sogar) ganz anders handhaben, als mit require und Sourceinbindungen zu arbeiten...

      Vielen Dank für die schnelle Antwort ;)

      Um sowas handelt es sich auch. Ich wollte sowohl mal etwas Code zusammenfassen als auch mal Configurationskonstanten auslagern (z.B. Dateinamen, Hintergrundfarben usw.) Wie funktioniert denn diese andere Handhabe ??

      Daß man Perl i.A. nicht compiliert ist mir klar. Aber durch die Beschreibung der Handhabung des "require" Befehls (6 oder 7 Seiten) bin ich nicht ganz durchgestiegen. Da stand z.B. daß man die Teile nur in bestimmten Verzeichnissen unterbringen kann und da war von einer richtigen Installation der Module die Rede. Wirkte jedenfalls auf den ersten Blick sehr aufwendig. Oder habe ich da 2 Sachen vermischt ??? Sind Module und die Sachen, die man mit "require" einbindet 2 verschiedene Paar Schuhe ??

      vielen Dank

      1. Halihallo nochmals

        Was für Konstanten speicherst du? - Kann man das nicht irgendwie in eine "ganz normale" andere Datei unterbringen?

        cfg-Datei schreit mir nach sowas:

        name1=value1
        name2=value2
        ...

        sowas lässt sich (und sollte sogar) ganz anders handhaben, als mit require und Sourceinbindungen zu arbeiten...

        Vielen Dank für die schnelle Antwort ;)

        Immer gerne ;)

        Um sowas handelt es sich auch. Ich wollte sowohl mal etwas Code zusammenfassen als auch mal Configurationskonstanten auslagern (z.B. Dateinamen, Hintergrundfarben usw.) Wie funktioniert denn diese andere Handhabe ??

        my %config;
        open( CNF, '<./config.cnf' ) or die 'sh*** cannot open file : '.$!;
        while (<CNF>) {
           chomp;      # keine Zeilenumbrüche
           s/#.*//;    # keine Kommentare
           s/^\s+//;   # keine anfangs-whites
           s/\s+$//;   # und keine am Ende
           next unless length;   # na, was übrig, wenn ja, dann...
           my ($name, $value) = split(/\s*=\s*/, $_, 2);
           $config{$name}=$value;
        }
        close CNF or die 'shit happens';

        so kannst du folgende Datei einlesen:

        Kommentar wird ignoriert

        hello = world
            test = 15

        wenn du dann print $config{'hello'} eingiebst, wird "world" ausgegeben.

        Daß man Perl i.A. nicht compiliert ist mir klar. Aber durch die Beschreibung der Handhabung des "require" Befehls (6 oder 7 Seiten) bin ich nicht ganz durchgestiegen. Da stand z.B. daß man die Teile nur in bestimmten Verzeichnissen unterbringen kann und da war von einer richtigen Installation der Module die Rede. Wirkte jedenfalls auf den ersten Blick sehr aufwendig. Oder habe ich da 2 Sachen vermischt ??? Sind Module und die Sachen, die man mit "require" einbindet 2 verschiedene Paar Schuhe ??

        Äm... Also: require tut gar nix anderes, als irgendetwas in das Programm einzubinden. Dieses etwas wird auch auf Perl-Code-Validität überprüft, sonst gibt's ein Fehler. Aber ob du nun eine Funktion, ein Modul oder ein anderes Programm requirest ist der require-Prozedur eigentlich wurscht...
        Module sind spezielle Perl-"Programm" (oder eben besser: Module). Diese sind keine allein lauffähigen Programme, sondern sie sind "Sammelpackete"... Du hast z. B. ein Problembereich "Kalenderfunktionen" und möchtest diese irgendwo sammeln und zu einem Packet zusammenschnüren => das gibt dann ein Modul... Soweit klar?

        Viele Grüsse

        Philipp

        1. Hallo Philipp,

          vielen Dank für die superschnelle Antwort.

          Das ganze Modulgedöhns, was da noch stand brauche ich also für diese Problemstellung nicht. Ich hatte den "require"-Befehl nämlich irgendwann schonmal ausprobiert und damals hat es nicht geklappt. Dann lag der Fehler also woanders und nicht in der Installation. Ich werde das Ganze heute abend nach der arbeit mal in Ruhe durchprobieren. Prinzipiell müßte man doch Deine Funktion in eine Include-Datei packen können (da sie ja von allen Modulen gebraucht wird) und die Constanten dann in die Config-Datei. Wird wohl eine lange Nacht, bis alles läuft ;)

          1. Halihallo

            vielen Dank für die superschnelle Antwort.

            höhö ;)

            Das ganze Modulgedöhns, was da noch stand brauche ich also für diese Problemstellung nicht.

            Aber lern es trotzdem, wenn du Zeit hast; ist ne ganz nette Sache! ;)

            Ich hatte den "require"-Befehl nämlich irgendwann schonmal ausprobiert und damals hat es nicht geklappt. Dann lag der Fehler also woanders und nicht in der Installation.

            Was meinst du denn überhaupt mit Installation? - Wenn du so willst, liest require einfach eine Datei und kopiert diese in die aktuell auszuführende... Was gibt's hier zu installieren?
            Approppos Verzeichnis:

            Zu einer Datei gehört nunmal ein Verzeichnis... Das geht auch bei require nicht anders... Bei Modulen ist es eben so (und deshalb gibt's hier auch die meisten "Probleme"), dass der Modulname auch mit dem Verzeichnis "übereinstimmen" muss...

            z. B. hast du ein Modul in Verzeichnis ./Module/Kalender.pm (.pm ist die "Kennzeichnung" von Modulen), dann _MUSS_ das Modul "Module::Kalender" heissen, sonst geht's nicht...

            Ich werde das Ganze heute abend nach der arbeit mal in Ruhe durchprobieren. Prinzipiell müßte man doch Deine Funktion in eine Include-Datei packen können (da sie ja von allen Modulen gebraucht wird) und die Constanten dann in die Config-Datei. Wird wohl eine lange Nacht, bis alles läuft ;)

            Lass dich nicht unterkriegen ;)

            Vielleicht schon mal dein erstes Modul gefällig? :

            package ConfigReader;

            use strict;

            sub read_config ($) {
               my ($file_name) = @_;
               my %config;
               open( CNF, '<'.$file_name ) or die 'sh*** cannot open file : '.$!;
               while (<CNF>) {
                  chomp;      # keine Zeilenumbrüche
                  s/#.*//;    # keine Kommentare
                  s/^\s+//;   # keine anfangs-whites
                  s/\s+$//;   # und keine am Ende
                  next unless length;   # na, was übrig, wenn ja, dann...
                  my ($name, $value) = split(/\s*=\s*/, $_, 2);
                  $config{$name}=$value;
               }
               close CNF or die 'shit happens';
               return %config;
            }

            1;

            so und dann noch ein Programm:

            #!/usr/bin/perl

            use strict;
            use ConfigReader;

            my %test = &ConfigReader::read_config('./test.cnf');

            print $test{'hello'};

            Viele Grüsse

            Philipp

            1. Hallo,

              Vielleicht schon mal dein erstes Modul gefällig? :

              package ConfigReader;

              Alternativ könnte auch das Module IniConf oder Resources, zu finden über http://search.cpan.org/Catalog/Option_Parameter_Config_Processing/, nützlich sein;-)

              Grüße
                Klaus

      2. Hallo,

        Um sowas handelt es sich auch. Ich wollte sowohl mal etwas Code zusammenfassen als auch mal Configurationskonstanten auslagern (z.B. Dateinamen, Hintergrundfarben usw.) Wie funktioniert denn diese andere Handhabe ??

        Dafür gibts drei Anweisungen:
        use, require und do.

        Daß man Perl i.A. nicht compiliert ist mir klar. Aber durch die Beschreibung der Handhabung des "require" Befehls (6 oder 7 Seiten) bin ich nicht ganz durchgestiegen. Da stand z.B. daß man die Teile nur in bestimmten Verzeichnissen unterbringen kann und da war von einer richtigen Installation der Module die Rede.

        Module kannst Du auch wie dynamische Bibliotheken betrachten. Und es hat sich in der Praxis als brauchbar erwiesen, daß eben diese an einem vordefinierten Ort bzw. Orten abgelegt sind. Die Pfade, die für use und require benutzt werden, sind übrigens über das Array @INC vom Script aus erreichbar.

        Übrigens ist es auch in C so, daß nur bestimmet Verzeichnisse nahc Include-Dateien durchsucht werden.

        Wenn Du Deine Module in einem Ordner ablegene willst, welcher noch nicht in @INC aufschein, dann kannst Du dies mit
        use lib '/pfad/zu/deinen/modulen';
        dem Script mitteilen.

        Wirkte jedenfalls auf den ersten Blick sehr aufwendig.

        Aber nur auf dem ersten Blick;-)

        Oder habe ich da 2 Sachen vermischt ??? Sind Module und die Sachen, die man mit "require" einbindet 2 verschiedene Paar Schuhe ??

        Nach Studium der Dokumentation von use und require wirst Du sehen, daß da eigentlich nicht viel Unterschiede vorhanden sind.
        Wichtig könnte eventuell sein, daß mit use die Module bereits bei der 'Compilierung' des Scripts einbindet[1], während require die Module erst zur Laufzeit einbindet.

        'do' wäre dann noch die dritte Möglichkeit, Code aus einer anderen Datei einzubinden.

        Alle Funktionen erfordern allerdings (natürlich) gültigen Perl-Code in diesen Dateien. Einfache 'name=wert' Paarungen mußt Du also vergessen.

        Grüße
          Klaus

        [1] genauer gesagt: im BEGIN-Block