Chrisi: new $var() - Aber wie?

Hi zusammen,

ich möchte gern Objekte mit Variablem Namen erstellen lassen, dazu habe ich mir folgendes überlegt:

$pkg = new pkgname()

flexibler wäre es wenn es so klappen würde

$pkg = new $hash{pkgname}()

$hash{pkgname} enthält einen String wie z.B. "meinpkg".

Vermutlich muss ich da etwas Quoten oder auf eine andere Funktion zurückgreifen, sowas wie call_user_func(name,param) oder ähnlich?

Ich danke für eure Hilfe!

Viele Grüße, Chrisi

  1. $pkg = new $hash{pkgname}()

    $hash{pkgname} enthält einen String wie z.B. "meinpkg".

    Was soll »$hash{pkgname}« bedeuten? Was für ein Hash ist das? Was soll diese Schreibweise. Ich kenne die nur von variablen Variablen: ${$string}

    Willst du vielleicht einfach einen Klassennamen in einer Variablen? Kein Problem:

    class Foo {}
    $classname = "Foo";
    $instance = new $classname;

    Mathias

    1. Hallo molily!

      Was soll »$hash{pkgname}« bedeuten?

      Das ist der Schlüssel 'pkgname' vom Hash %hash.

      Was für ein Hash ist das?

      Das verschweigt der OP.

      Was soll diese Schreibweise.

      Die normale Schreibweise, die Werte anhand des Keys zu erhalten:

      $ENV{DOCUMENT_ROOT} -> gibt aus dem Hash %ENV (Umgebungsvariablen) den Wert eben des Document Roots...

      Ich kenne die nur von variablen Variablen: ${$string}

      Du meinst hier sicher etwas anderes? Denn das dürfte Perl irritieren... Allerdings kann man Skalare so notieren:

      ${skalar}

      z.B. um Ambiguitäten zu vermeiden:

      print "Zum $numberte Mal habe ich Dir gesagt...."; # Ups!

      und gemeint ist:

      print "Zum ", $number, "te Mal habe ich Dir gesagt....";

      dann geht's auch so:

        
      print "Zum ${number}te Mal habe ich Dir gesagt...."; # Aah!
      

      Aber wie dem auch sei, ich verstehe das Problem des OP auch nicht ;)

      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. Du meinst hier sicher etwas anderes? Denn das dürfte Perl irritieren...

        Sorry, ich nehme alles zurück und behaupte das Gegenteil - ich dachte, es ginge um PHP. :)

        Was soll »$hash{pkgname}« bedeuten?

        Das ist der Schlüssel 'pkgname' vom Hash %hash.

        Das ist mir geläufig, daran hätte ich merken müssen, dass ich auf dem falschen Dampfer bin.

        Mathias

        1. Hallo molily!

          Das ist mir geläufig, daran hätte ich merken müssen, dass ich auf dem falschen Dampfer bin.

          In Sachen Zerstreutheit musst Du noch viel an Dich arbeiten, um mich einzuholen, in dieser Forumshauptdatei habe ich im Moment die Nase vorn ;)

          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. 你好 molily,

      und jetzt nochmal schauen, welche Programmiersprache da als Kategorie angegeben ist, hehe :)

      Zur Frage:

        
      %hash = (pkgname => 'A::B');  
      $obj = $hash{pkgname}->new();  
      
      

      sollte gehen, sofern no strict 'refs' gesetzt ist bzw. strict überhaupt gar nicht aktiv ist.

      再见,
       克里斯蒂安

      --
      http://wwwtech.de/
      IRC-Clients und Irssi-Scripting | Flyspray
      Wenn der Schüler bereit ist, erscheint der Meister.
      1. Hi,

        sollte gehen, sofern no strict 'refs' gesetzt ist bzw. strict überhaupt gar nicht aktiv ist.

        Treffer, dass klappt. Strict ist bei mir aktiv, Fehler schmeisst er mir aber keine.

        Danke & Viele Grüße, Chrisi

  2. ich möchte gern Objekte mit Variablem Namen erstellen lassen, dazu habe ich mir folgendes überlegt:

    Der Wunsch ist sehr ungewöhnlich, was hast du vor?

    $pkg = new pkgname()

    flexibler wäre es wenn es so klappen würde

    $pkg = new $hash{pkgname}()

    $hash{pkgname} enthält einen String wie z.B. "meinpkg".

    Vermutlich muss ich da etwas Quoten oder auf eine andere Funktion zurückgreifen, sowas wie call_user_func(name,param) oder ähnlich?

    einfacher:
    my $obj = new {$hash{pkgname}}();

    Struppi.

    1. »» ich möchte gern Objekte mit Variablem Namen erstellen lassen, dazu habe ich mir folgendes überlegt:

      Der Wunsch ist sehr ungewöhnlich, was hast du vor?

      Ich Frage diverse Werte ab und speicher mir diese in einen HASH. Dannach klapper ich mein Program durch und lasse je nach Wert entspr. Module laden bzw. die Objekte erstellen um mit diesen arbeiten zu können.

      Hier z.B. möchte ich ein Objekt vom Modul test haben:

      %hash{pkgname} = "test";  
        
      my $obj = new {$hash{pkgname}}();
      

      Ich habe einen recht grossen HASH, der dann durch ein Schleife geht und ein Modul nach dem anderen lädt und seine Aufgaben abarbeitet. Die versch. Module enthalten z.B. Methoden zum erstellen von Filesystemen.

      einfacher:
      my $obj = new {$hash{pkgname}}();

      Leider nicht :-)

      my $obj = new {$hash{pkgname}}();

      Schmeist mir einen:

      syntax error near "}("

      Habe ich was übersehen?

      Viele Grüße, Chrisi

  3. Ich erhebe den schweren Zeigefinger ob der Nichtbefolgung von Community Best Practices meiner Threadnachbarn. Ich weiß, dass sie nicht unfähig sind, ich vermute nur Müdigkeit beim Beantworten.

    So, jetzt noch mal am Stück, fertig zum Ausprobieren, und ohne diese grauslige indirekte Objektsyntax, sprich Methodenaufrufe wie »new« sollen immer nach der Klasse/Instanz stehen, nicht davor. Die Gründe sind an anderer Stelle zur Genüge erörtert.

      
    use Module::Load qw(load);  
    my %hash = (pkgname => 'meinpkg');  
    load $hash{pkgname};  
      
    my $instanz = $hash{pkgname}->new(1, 2, 3, 'params');  
    
    

    Liest sich das nicht viel besser?