Stefan (Perl-Anfänger): Platzierung von Unterprogrammen

Hallo,
stellt man subroutines sinnvollerweise vor oder hinter das Hauptprogramm?
Was ist ggf. zu beachten?

  1. Hallo,
    stellt man subroutines sinnvollerweise vor oder hinter das Hauptprogramm?

    prinzipiell völlig egal!
    Ich packe Sie immer nach ganz unten (heißt ja auch Unterprogramm! :)).

    Also, erst die ganzen Module per "use" einbinden, dann Variablen deklarieren, dann Hauptprogramm und ganz nach unten die Subs.

    Gruß
    Reiner

    1. Hi,

      stellt man subroutines sinnvollerweise vor oder hinter das Hauptprogramm?

      prinzipiell völlig egal!

      Ist das auch egal, wenn man die Anzahl der Übergabeparameter mit angibt? Kanns grad net ausprobieren.

      also so z.B.:

        
      sub funOne($$)  
      {  
      ...  
      }  
      
      

      In C ist das dann beispielsweise so (soweit ich mich erinnern kann), dass wenn man die Routine erst nach main() anlegt, man oben den Prototypen deklarieren muss, oder der Compiler nicht überprüfen kann, ob die Parameter korrekt übergeben wurden.

      Ansonsten würde ich auch sagen, dass es egal ist. Ich mach die subs immer oben hin, aber is dann wohl geschmackssache.

      mfG,
      steckl

      1. Hallo!

        Ist das auch egal, wenn man die Anzahl der Übergabeparameter mit angibt? Kanns grad net ausprobieren.

        also so z.B.:

        sub funOne($$)
        {
        ...
        }

        »»  
          
        Habs grad mal ausprobiert. Wenn man die Subroutinen ans Ende stellt, funktioniert nur die Parameterüberprüfung nicht, die Subroutinen werden ausgeführt:  
          
        ~~~perl
          
        test('hallo');  
        sub($$) { print join (' ' => @_), "\n" }  
        
        

        wird beanstandungslos durchgerattert, bei

          
        sub($$) { print join (' ' => @_), "\n" }  
        test('hallo');  
        
        

        wird der fehlende Parameter wie erwünscht reklamiert.

        Grüße, Skrilax

        1. Hallo!

          Habs grad mal ausprobiert. Wenn man die Subroutinen ans Ende stellt, funktioniert nur die Parameterüberprüfung nicht, die Subroutinen werden ausgeführt:

          test('hallo');
          sub($$) { print join (' ' => @_), "\n" }

          
          > wird beanstandungslos durchgerattert, bei  
          >   
          > ~~~perl
            
          
          > sub($$) { print join (' ' => @_), "\n" }  
          > test('hallo');  
          > 
          
          

          wird der fehlende Parameter wie erwünscht reklamiert.

          Da stellt Stefan (Perl-Anfänger!) eine Frage - und dann so ein Beispiel!
          Ich verstehe nur Bahnhof!!
          sub($$), ' ' => @_ ....?

          1. Hi,

            Da stellt Stefan (Perl-Anfänger!) eine Frage - und dann so ein Beispiel!
            Ich verstehe nur Bahnhof!!
            sub($$), ' ' => @_ ....?

            Du kannst einer Perl-Funktion bei ihrer Definition sagen, wie viele Argumente sie entgegennehmen muss. Das kannst du hinter ihrem Namen in Klammern angeben, kannst du aber auch weglassen, dann sind es beliebig viele.

            Du schreibst dann beispielsweise
            sub funktionOne($$){...}
            Das heißt, dass die Funktion genau 2 Argumente erwartet.
            Wenn du sie jetzt so aufrufst:
            funktionOne(1,2);
            wird sie ganz normal ausgeführt.
            Wenn du sie aber mit
            funktionOne(1,2,3);
            aufrufst, meckert der Interpreter, dass die Anzahl der übergebenen Argumente (3) nicht mit der Anzahl der erwarteten Elemente (2) übereinstimmt.
            Das meckert er aber (laut Skrilax) nur an, wenn du die Subroutinen vor dem Hauptprogramm definierst.

            Hoffe jetzt ist es einigermaßen verständlich für dich?

            mfG,
            steckl

            1. Du kannst einer Perl-Funktion bei ihrer Definition sagen, wie viele Argumente sie entgegennehmen muss.

              Ergänzung: Und welchen Typs sie sein soll (m.E. der wichtigere Part von Prototyping).

              sub funktionOne($$){...}
              Das heißt, dass die Funktion genau 2 Argumente erwartet.

              Ergänzung: Und beide Parameter im skalaren Kontext behandelt. Übergib dieser Funktion mal spaßeshalber zwei Arrays ... ;)

              Das meckert er aber (laut Skrilax) nur an, wenn du die Subroutinen vor dem Hauptprogramm definierst.

              Ja, ist zwar in perlsub ein bisschen verklausuliert, aber trotzdem:
              http://perldoc.perl.org/perlsub.html#Prototypes-prototype-subroutine%2C-prototype

              Das beißt sich zwar mit meinem Verständnis von BEGIN-Blöcken, aber niemand (weder Perl noch meine Wenigkeit) ist perfekt :)

              Siechfred

              --
              Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
          2. Ich verstehe nur Bahnhof!!
            sub($$), ' ' => @_ ....?

            *gnarfl* ein Abschreibfehler. Das muss natürlich
            sub test($$)
            heißen.

            Ansonsten hat steckl die ($$)-Geschichte ja schon erklärt. Zu dem => ergänze ich dann noch, dass => syntaktisch fast äquivalent zum Komma ist. Der einzigste Unterschied ist, dass eine evtl. davor stehende Zeichenkette automatisch als solche erkannt wird. Beispiel:
            my %hash = ( a => 'hallo', b => 'welt' );
            kann auch geschrieben werden als
            my %hash = ( 'a', 'hallo', 'b', 'welt' );

            Ich nutze diesen Fakt dann vielmehr in Funktionsaufrufen aus, da ich es oft als angenehmer zu lesen empfinde, wenn statt eines Kommas ein => steht, z.B.
            open my $file => 'pfad/zur/textdatei';
            oder eben
            join ' ' => @array;
            Das ist aber wohl in erster Linie eine Frage des persönlichen Geschmacks...

            Grüße, Skrilax