KebdnK: Objectattribute dynamisch ansprechen

Hallo Leute,
ich möchte von einem Objekt in Perl ein Attribut dynamisch ansprechen.
Folgender Code soll als Beispiel dienen.

  
  
my %test = ("Attr1" => 1, "Attr2" => 2, "Attr3" => 3);  
  
foreach(keys(%test)) {  
  my $key = $_;  
  
  print $object->{$key};  
}  
  

Ich hoffe, ihr könnt euch ungefähr vorstellen, was ich meine. Ich hab in der richtigen Anwendung einen Hash mit ca 20 Einträgen, wobei die Keys auch gleichzeitig Attribute eines Objekts sind. Da ich jedes Attribut auf einen bestimmten Wert hin überprüfen muss, wäre es elegant, wenn ein solches Konstrukt mit foreach gehen würde.

Danke im voraus.

KebdnK

  1. Ich hoffe, ihr könnt euch ungefähr vorstellen, was ich meine. Ich hab in der richtigen Anwendung einen Hash mit ca 20 Einträgen, wobei die Keys auch gleichzeitig Attribute eines Objekts sind. Da ich jedes Attribut auf einen bestimmten Wert hin überprüfen muss, wäre es elegant, wenn ein solches Konstrukt mit foreach gehen würde.

    Ich verstehe nicht wo dein Problem ist, der Code den du uns gezeigt hast funktioniert doch?

    Struppi.

  2. print $object->{$key};

    Ich hoffe, ihr könnt euch ungefähr vorstellen, was ich meine. Ich hab in der richtigen Anwendung einen Hash mit ca 20 Einträgen, wobei die Keys auch gleichzeitig Attribute eines Objekts sind. Da ich jedes Attribut auf einen bestimmten Wert hin überprüfen muss, wäre es elegant, wenn ein solches Konstrukt mit foreach gehen würde.

    Schreibe in deiner Klasse eine eigene Getter-Methode.
        $ob->getAttr( "One_KEY" )
    statt direkt auf Daten zuzugreifen.
    Grund:
        $ob->getAttr( "DOES_NOT_EXIST" )
    muss abgefangen und richtig beantwortet werden.
    Kann auch bedeuten, dass auf Bedarf erst initialisiert wird

    foreach(qw(list of hashkeys) ){  
       print $ob->getAttr( $_ );  
    }
    

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische
  3. @Struppi
    Nicht wenn man "use strict" an hat.

    @Beat
    Deine Lösung würde klappen, wenn ich direkten Zugriff auf den Quelltext des Objektes hätte. Hier handelt es sich aber um Objekte aus einem anderen Perl-Modul, die ich nicht verändern kann oder will.

    1. @Struppi
      Nicht wenn man "use strict" an hat.

      Doch, das funktioniert einwandfrei und ohne Meldung:

      #!/usr/bin/perl -w  
      use strict;  
      my %test = ("Attr1" => 1, "Attr2" => 2, "Attr3" => 3);  
      my $object = bless {  
      Attr1 => 1,  
      Attr2 => 2,  
      Attr3 => 3  
      };  
        
      foreach(keys(%test)) {  
        my $key = $_;  
        
        print $object->{$key};  
      }
      

      Struppi.

  4. Hallo,
    danke für die Antwort. Die Sache funktioniert deshalb nicht, da es keine Attribute, sondern Methoden sind.
    Das war mein Fehler.

    Vielleicht fällt euch noch etwas ein.

    1. danke für die Antwort. Die Sache funktioniert deshalb nicht, da es keine Attribute, sondern Methoden sind.

      Auch dann funktionert es, du musst nur auf die Methoden zugreifen:

      #!/usr/bin/perl -w  
      use strict;  
      package P;  
      sub new { return bless {}, shift;}  
        
      sub Attr1 {1;}  
      sub Attr2 {2;}  
      sub Attr3 {3;}  
        
      package main;  
        
      my %test = ("Attr1" => 1, "Attr2" => 2, "Attr3" => 3);  
      my $object = P->new();  
      foreach(keys(%test)) {  
        my $key = $_;  
        
        print $object->$key;  
      }
      

      Struppi.

    2. Vielleicht fällt euch noch etwas ein.

      ERROR https://forum.selfhtml.org/?t=193130&m=1289295 Line 2: "es" is not defined.
      Manchmal muss man dumm wie ein Debugger sprechen.

      mfg Beat

      --
      ><o(((°>           ><o(((°>
         <°)))o><                     ><o(((°>o
      Der Valigator leibt diese Fische