selaviano: Unterschied: 'new CGI' und 'CGI->new'

hallo zusammen,

ich muß mich grad durch ein paar perl-scripts kämpfen und
dabei ist mir was aufgefallen, was ich nicht versteh.

wie im threadnamen bereits steht; was ist der unterschied
zwischen:

$foo =  CGI->new;

$bar = new CGI;

oder existiert da überhaupt einer? hab leider im forum noch
nichts dazu gefunden.

vielleicht ist meine frage auch so trivial, daß sie noch keiner
gestellt hat.

vorweg danke

  1. hallo,

    was ist der unterschied zwischen:
    $foo =  CGI->new;
    $bar = new CGI;
    oder existiert da überhaupt einer?

    Doch, das ergibt einen Unterschied. Am besten probierst du es einfach aus:

      
    print $foo;  
    print $bar;  
    
    

    vielleicht ist meine frage auch so trivial, daß sie noch keiner
    gestellt hat.

    Das hat nichts mit "trivial" zu tun. Aber meines Wissens wurde so tatsächlich noch nicht gefragt.

    Grüße aus Berlin

    Christoph S.

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

      was ist der unterschied zwischen:
      $foo =  CGI->new;
      $bar = new CGI;
      oder existiert da überhaupt einer?

      Doch, das ergibt einen Unterschied. Am besten probierst du es einfach aus:

      print $foo;
      print $bar;

        
      he Christoph, lass keinen gucken ;-)  
        
      Versuchs mal damit:  
      print ref $foo, "\n";  
      print ref $bar, "\n";  
        
        
      \--roro  
        
        
        
      
      
      1. und nochmal hallo zusammen,

        erstmal danke für die vielen antworten.

        ich finde das schon sehr strange, daß

          
        CGI->new  
        new CGI  
        CGI.new  
        
        

        immer zum selben ergebnis führt.

        Doch, das ergibt einen Unterschied. Am besten probierst du es einfach aus:

        print $foo;
        print $bar;

          
        das mit dem unterschied versteh ich nicht so ganz. denn wenn ich alles richtig verstanden habe wird durch den 'new' konstruktor eine neue instanz von CGI erstellt egal mit welcher der drei oben genannten möglichkeiten ich das mache. und die variable z.b. $foo hat dann ne referenz drauf.  
          
        wenn ich mir die ausgabe von obigem code anschauen steht da irgendwas wie:  
          
        ~~~perl
          
        CGI=HASH(...)  
        
        

        wobei der hex wert von hash wahrscheinlich die adresse des objektes ist. natürlich muß die ausgabe von $foo und $bar eine andere sein, da es nicht das selbe objekt ist.

        dickes merci

        hallo,

        was ist der unterschied zwischen:
        $foo =  CGI->new;
        $bar = new CGI;
        oder existiert da überhaupt einer?

        Doch, das ergibt einen Unterschied. Am besten probierst du es einfach aus:

        print $foo;
        print $bar;

        
        >   
        > he Christoph, lass keinen gucken ;-)  
        >   
        > Versuchs mal damit:  
        > print ref $foo, "\n";  
        > print ref $bar, "\n";  
        >   
        >   
        > --roro  
        >   
        >   
        >   
        > 
        
        1. ich finde das schon sehr strange, daß

          CGI->new
          new CGI
          CGI.new

          
          >   
          > immer zum selben ergebnis führt.  
            
          Wie ich in meinem Posting erklärt habe, weil der erste Parameter für die Funktion new immer der Gleiche ist nämlich CGI.  
            
          
          > > > Doch, das ergibt einen Unterschied. Am besten probierst du es einfach aus:  
          > > > ~~~perl
            
          
          > > > print $foo;  
          > > > print $bar;  
          > > > 
          
          

          das mit dem unterschied versteh ich nicht so ganz. denn wenn ich alles richtig verstanden habe wird durch den 'new' konstruktor eine neue instanz von CGI erstellt egal mit welcher der drei oben genannten möglichkeiten ich das mache. und die variable z.b. $foo hat dann ne referenz drauf.

          Es gibt keinen new Konstruktor in Perl. Das ist eine beliebige Funktion, die zufälligerweise oft so genannte wird, weil es in anderen Sprachen so ist.
          Diese Funtion segnet ein Objekt, meistens das was als erster Parameter übergeben wird. (mehr dazu in Perldoc)

          wenn ich mir die ausgabe von obigem code anschauen steht da irgendwas wie:

          CGI=HASH(...)

          
          >   
          > wobei der hex wert von hash wahrscheinlich die adresse des objektes ist. natürlich muß die ausgabe von $foo und $bar eine andere sein, da es nicht das selbe objekt ist.  
            
          Das ist widerrum richtig.  
            
          Struppi.
          
          -- 
          [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
          
          1. hallo Struppi,

            meine wortwahl geht sicherlich manchmal an der des wissenden perl programmierers, der ich nicht bin, vorbei.

            die links zu perldoc hab ich mir angeschaut. daß das 'kind'/funktion auch einen anderen namen haben darf ist ja logisch.

            mit

            ich finde das schon sehr strange, daß

            CGI->new
            new CGI
            CGI.new

            
            > >   
            > > immer zum selben ergebnis führt.  
              
            meinte ich nur, daß es für perl laien wirkt, als wenn sich die perl entwickler nicht wirklich entscheiden können oder je nachdem gerade dem momentanen trend folgen.  
              
            ich programmier eigentlich meistens in Smalltalk und Java.  
              
            manchmal muß man aber eben irgendwas ändern, was irgendwann mal von irgendjemandem geschrieben wurde. und dann wird's wirklich abgefahren. und bei perl hat da jeder irgendwie seinen sehr eigenen stil, was das ganze nicht einfacher macht. das ist mein eindruck.  
              
            nochmal danke für die mühe + schönen abend noch  
              
              
            
            > > ich finde das schon sehr strange, daß  
            > >   
            > > ~~~perl
              
            
            > > CGI->new  
            > > new CGI  
            > > CGI.new  
            > > 
            
            

            immer zum selben ergebnis führt.

            Wie ich in meinem Posting erklärt habe, weil der erste Parameter für die Funktion new immer der Gleiche ist nämlich CGI.

            Doch, das ergibt einen Unterschied. Am besten probierst du es einfach aus:

            print $foo;
            print $bar;

            
            > >   
            > > das mit dem unterschied versteh ich nicht so ganz. denn wenn ich alles richtig verstanden habe wird durch den 'new' konstruktor eine neue instanz von CGI erstellt egal mit welcher der drei oben genannten möglichkeiten ich das mache. und die variable z.b. $foo hat dann ne referenz drauf.  
            >   
            > Es gibt keinen new Konstruktor in Perl. Das ist eine beliebige Funktion, die zufälligerweise oft so genannte wird, weil es in anderen Sprachen so ist.  
            > Diese Funtion segnet ein Objekt, meistens das was als erster Parameter übergeben wird. (mehr dazu in Perldoc)  
            >   
            > > wenn ich mir die ausgabe von obigem code anschauen steht da irgendwas wie:  
            > >   
            > > ~~~perl
              
            
            > > CGI=HASH(...)  
            > > 
            
            

            wobei der hex wert von hash wahrscheinlich die adresse des objektes ist. natürlich muß die ausgabe von $foo und $bar eine andere sein, da es nicht das selbe objekt ist.

            Das ist widerrum richtig.

            Struppi.

            1. meine wortwahl geht sicherlich manchmal an der des wissenden perl programmierers, der ich nicht bin, vorbei.

              Das war mir schon klar. Ich weiß ja was du meinst deshalb auch mein Einspruch. new ist im gegensatz zu vielen anderen Programmiersprachen eben kein Konstruktor in Perl, es gibt eben keinen.

              die links zu perldoc hab ich mir angeschaut. daß das 'kind'/funktion auch einen anderen namen haben darf ist ja logisch.

              In Perl schon.

              mit

              ich finde das schon sehr strange, daß

              CGI->new
              new CGI
              CGI.new

              
              > > >   
              > > > immer zum selben ergebnis führt.  
              >   
              > meinte ich nur, daß es für perl laien wirkt, als wenn sich die perl entwickler nicht wirklich entscheiden können oder je nachdem gerade dem momentanen trend folgen.  
                
              Naja, es ist eher eine andere Philsophie [TIMTOWTDI ](http://de.wikibooks.org/wiki/Perl-Programmierung:_Larry_und_die_Perl_Kultur), d.h. du hast dadurch mehrere Möglichkeiten deine Objekte zu erzeugen.  
                
              
              > ich programmier eigentlich meistens in Smalltalk und Java.  
                
              Dann muss dir Perl sehr fremd vorkommen ;-)  
                
              
              > manchmal muß man aber eben irgendwas ändern, was irgendwann mal von irgendjemandem geschrieben wurde. und dann wird's wirklich abgefahren. und bei perl hat da jeder irgendwie seinen sehr eigenen stil, was das ganze nicht einfacher macht. das ist mein eindruck.  
                
              Das ist richtig, es gibt zwar auch [perlstyle](http://www.perl.com/doc/manual/html/pod/perlstyle.html), aber wer braucht schon Regeln ;-)  
                
              Struppi.
              
              -- 
              [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
              
              1. Hey,

                http://www.perl.com/doc/manual/html/pod/perlstyle.html

                Last-Modified: Mon, 11 Jun 2001 23:33:49 GMT

                Vorsicht mit dieser veralteten Website, das kann mal ins Auge gehen. Die aktuelle Dokumentation befindet sich auf http://perldoc.perl.org/ und http://search.cpan.org/dist/perl.

                --
                水-金-地-火-木-土-天-海-冥
                1. Hey,

                  http://www.perl.com/doc/manual/html/pod/perlstyle.html
                  Last-Modified: Mon, 11 Jun 2001 23:33:49 GMT

                  Vorsicht mit dieser veralteten Website, das kann mal ins Auge gehen. Die aktuelle Dokumentation befindet sich auf http://perldoc.perl.org/ und http://search.cpan.org/dist/perl.

                  Erwicht ;-)
                  Da ich eine lokale HTML Version von perldoc habe, benutze ich keine Bookmarks und gucke immer was ale erstes bei google erscheint. Ich werd mir die Links sichern.

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
  2. Hey,
    das ist kein trivialer Sachverhalt. Beides sind Methodenaufrufe, hier die Methode new des Objekts CGI. Die erste mit Pfeil ist die normale Syntax, sie hat keinen speziellen Namen. Der zweite, bei dem die Methode vor dem Objekt steht, heißt indirekte Objektsyntax. Du solltest ausschließlich die Syntax mit Pfeil verwenden (in Perl 6 durch den Punkt abgelöst). Hintergründe dazu in perlobj.
    http://perldoc.perl.org/perlobj.html#Method-Invocation-invocation-method-arrow-->
    http://perldoc.perl.org/perlobj.html#Indirect-Object-Syntax-indirect-object-syntax-invocation%2C-indirect-indirect

    --
    水-金-地-火-木-土-天-海-冥
  3. wie im threadnamen bereits steht; was ist der unterschied
    zwischen:

    $foo =  CGI->new;

    $bar = new CGI;

    oder existiert da überhaupt einer?

    Nein.

    Du weißt wie man in Perl ein Objekt erzeugt?

    sub new  
    {  
        my $self = shift;  
        bless {}, $self;  
    }  
    
    

    Der erste Parameter ist das Objekt das "gesegnet" wird, lass dir den mal ausgeben und mach ein eignes CGI package daraus:

    package CGI;  
    sub new  
    {  
        my $self = shift;  
        print "new $self\n";  
        return bless {}, $self;;  
    }  
    package main;  
    my $foo = new CGI();  
    my $bar = CGI->new();  
    
    

    Struppi.

    --
    Javascript ist toll (Perl auch!)