Pierre: Parameter an Subroutine übergeben

Liebes Forum,

bin gerade dabei fremden Perl-Code umzuschreiben, und habe dabei folgendes gefunden:

  
my $pack = $_;               # Package-Name  
my $mod  = $pack . '.pm';    # Module Name  
require $mod;  
my ($title, $result, $details) = $pack->check();  

Nun würde ich gern an die Subroutine "check" 2 Parameter übergeben (z.B. $test1 und $test2), also so:

my ($title, $result, $details) = $pack->check($test1, $test2);

Das funktioniert aber nicht, die beiden Parameter kommen bei der Subroutine check im Package $pack nicht an.

Was läuft da falsch?

Freue mich über Hilfe!

  1.   
    &test("Parameter1", "Parameter2");  
      
    sub test() {  
     $param1 = $_0;  
     $param2 = $_1;  
    }  
    
    

    Meinst du das?

    1. Ja, grundsätzlich schon. Nur funktioniert das so in dem Fall nicht. Liegt wohl an dem Pfeil mit dem die Subroutine aufgerufen wird.

      Ich versteh den Code ehrlich gesagt nicht ganz, habe auch im Internet dazu nichts gefunden.

      1. my ($title, $result, $details) = $pack->check();

        Ruft man Subs nicht mit einem '&' auf?
        my ($title, $result, $details) = $pack->&check(); ???

        1. »» my ($title, $result, $details) = $pack->check();
          Ruft man Subs nicht mit einem '&' auf?
          my ($title, $result, $details) = $pack->&check(); ???

          In dem Fall anscheinend nicht. Wenn ich ein & dazu mache kommt:

          syntax error at ./test.pl line 63, near "->&"
          Execution of ./test.pl aborted due to compilation errors.

        2. Hallo Hans!

          Ruft man Subs nicht mit einem '&' auf?

          Seit Perl 5 nicht mehr: http://perldoc.perl.org/perlsub.html

          Viele Grüße aus Frankfurt/Main,
          Patrick

          --
          _ - jenseits vom delirium - _

             Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
          J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
      2. Hallo Pierre!

        Liegt wohl an dem Pfeil mit dem die Subroutine aufgerufen wird.

        So werden nicht importierte Funktionen aus einem Modul aufgerufen, wenn das Modul es zuläßt (Objektorientiert). Beispiel mit dem CGI-Modul:

        use strict;  
        use CGI qw(header);  
          
        print header();
        

        ^^ Hier wird die Funktion header() aus dem CGI-Modul importiert.

        use strict;  
        use CGI;  
          
        my $cgi = CGI->new(); # Objektinstanz erstellen  
        
        

        print $cgi->header();

        ^^ Hier wird die selbe Funktion über die Objektinstanz aufgerufen.

        Ich versteh den Code ehrlich gesagt nicht ganz, habe auch im Internet dazu nichts gefunden.

        Ohne die Funktion check() im Modul umzuschreiben, wirst Du auch nichts erreichen können. Wäre schön, wenn Du uns verraten würdest, was check() macht, denn aus Deinem Beispiel sieht man nur, dass sie anscheinend eine Liste mit 3 Elementen zurückgibt.

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --
        _ - jenseits vom delirium - _

           Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
        1. Hallo,

          also das Hauptskript ruft einige Tests auf die jeweils ein eigenes Modul sind. In jedem dieser Module gibts ne Check-Funktion die den Test ausführt. Die Namen welche Tests/Module aufgerufen werden sollen wird aus ner Config-Datei ausgelesen:

          foreach (@Settings::tests) {   # Array mit Test/Modulnamen  
              my $pack = $_;               # Package-Name  
              my $mod  = $pack . '.pm';    # Module Name  
              require $mod;  
              my ($title, $result, $details) = $pack->check();  
              #print $title  
              # .... etc.  
          $nr++;  
          }
          

          Über $pack::check() würd zwar die Parameter-Übergabe klappen. Ich kann die Funktion aber so nicht aufrufen, da krieg ich ne Fehlermeldung weil eine Variable da anscheinend nicht erlaubt ist .

          1. Über $pack::check() würd zwar die Parameter-Übergabe klappen. Ich kann die Funktion aber so nicht aufrufen, da krieg ich ne Fehlermeldung weil eine Variable da anscheinend nicht erlaubt ist .

            Ich kann mich nur wiederholen, dir ist klar wie die Reihenfolge der Parameter in deiner Funktion sind?
            Mehr kann man dir so nicht sagen, da wir deine Funktion nicht kennen.

            Struppi.

            1. Sorry, das versteh ich jetzt nicht. Was hat die Reihenfolge der Parameter damit zu tun? Mein Problem ist ja, dass ich überhaupt keine Parameter übergeben kann, egal in welcher Reihenfolge.

              Bitte um Aufklärung, steh grad auf der Leitung :-)

              Die Funktion Check führt einen Test aus (je nach Modul unterschiedlich) und liefert den Titel, Resultat und Details zu dem Test zurück.

              Danke jedenfalls!

              1. Sorry, das versteh ich jetzt nicht. Was hat die Reihenfolge der Parameter damit zu tun? Mein Problem ist ja, dass ich überhaupt keine Parameter übergeben kann, egal in welcher Reihenfolge.

                Ich sprach nicht von der Reihenfolge, sondern vom ersten Parameter. Und wenn kein Parameter übergeben wird, dann machst du etwas falsch, nur wir Wissen nicht was.

                Die Funktion Check führt einen Test aus (je nach Modul unterschiedlich) und liefert den Titel, Resultat und Details zu dem Test zurück.

                Aja, aber die Funktion ist falsch. Du weißt wie man in Perl die Parameter übergibt und entgegen nimmt?

                Struppi.

                1. Ja, mittels shift.

                  Sonst stimmt ja alles, es liegt nur an dem Pfeil.

                  Wenn ich aus dem Pfeil ein :: (also z.B. Test1::check) mache klappts ja, aber das kann ich nicht weil der :: als Modulname keine Variable erlaubt.

                  Schon langsam bin ich am verzweifeln :-(

                  1. Sonst stimmt ja alles, es liegt nur an dem Pfeil.

                    Ich hab deinen Code ausprobiert und es funktioniert tadellos. Wenn du uns nicht deine Funktion zeigst oder zumindest wie die die Parameter verabeitet, kann man dir nicht helfen.

                    Struppi.

          2. Hallo Pierre!

            Wie dem auch sei, was die jeweiligen check()-Funktionen machen müssten wir schon sehen, wie Struppi und ich nicht müde sind zu wiederholen. Sind sie in jedem Modul gleich?

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --
            _ - jenseits vom delirium - _

               Diblom   [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            J'ai 10 ans! | Achtung Agentur! | Nichts ist unmöglich? Doch! | Heute schon gegökt?
  2. Das funktioniert aber nicht, die beiden Parameter kommen bei der Subroutine check im Package $pack nicht an.

    Was läuft da falsch?

    Das läßt sich nicht sagen, da du uns nicht zeigst wie du die Parameter in der sub entgegen nimmst. dir ist aber klar, dass der erste Parameter das Package ist?

    Struppi.

  3. Hey,

      
    package foo;  
    use strict;  
    use warnings;  
    use Data::Dumper;  
      
    sub bar  
    {  
      warn Dumper(\@_);  
    }  
      
    1;  
      
    package main;  
      
    foo->bar(1, 2, 3);  
    
    

    viel glück