2017-02-14 6 views
0

Ich versuche, eine obscurely dokumentierte Bibliothek zu verwenden, dieWie komme ich zu diesen gesegneten Variablen?

bless gesegnet etwas Rückkehr zu sein scheint ist zu erklären, es Sinn nie sogar nach einer Anzahl von Versuchen zu lesen, so dass ich nur frage die einfache Frage, wie komme ich zu diesen Membervariablen?

Die Fehlermeldung scheint mit der Data::Dumper Ausgabe zu kollidieren, obwohl auf die Chance, dass $vm_ds gesegnet werden musste, habe ich versucht, "bless ($ vm_ds, 'ManagedObjectReference');" in und bekam nur

kein Hashreferenz bei blib/lib/Klasse/Method/scalar.pm (Autosplit in blib/lib/auto/Klasse/Method/Skalar/scal0000.al) -Leitung 252.

für meine Probleme.

my $vm_ds = $vm_view->datastore; 

    print "--datastore--\n"; 

    print Dumper($vm_ds); 

    print "vm_ds1: ", $vm_ds->value, "\n"; 

    exit 0; 
$VAR1 = [ 
     bless({ 
      'value' => 'filer01-cvo-2.fs.peak.org:/vol/vmfs01', 
      'type' => 'Datastore' 
     }, 'ManagedObjectReference') 
    ]; 
Can't call method "value" on unblessed reference at ./getvms line 93. 
+0

$ vm_ds -> {Wert} funktioniert auch nicht? – user3606329

+0

Ich habe das versucht und es gibt "keine Hash-Referenz" – abatie

Antwort

2

$vm_ds ist eine Referenz auf ein Array (daher die [ ... ] in Dumper Ausgang) mit einer Position ManagedObjectReference eine Instanz der Klasse zu sein (dies ist die Bedeutung von Segen: sagen, dass etwas, das ein Beispiel ist, von einer Klasse) Also müssen Sie $vm_ds->[0]->value() statt $vm_ds->value() tun. 0 ist das erste Element im Array (Ihr Beispiel zeigt nur einen Eintrag, aber in einem generischen Fall kann Ihr Array-Verweis mehrere Einträge enthalten).

+0

Ich habe gerade bemerkt, dass und wenn die Tatsache $ vm_ds -> [0] -> {'Wert'} funktioniert. Vielen Dank! – abatie

+1

Ja, aber mit Objekten sollten Sie so lange wie möglich bei der Klassen-API bleiben und daher Methoden verwenden, die in der Klasse definiert sind, um auf Elemente zuzugreifen (zB '-> value()') statt direkt in die zugrunde liegende Variable zu stochern ('-> { 'Wert'} '). –

4

$vm_ds ist eine Referenz auf ein Array von einem gesegneten Hash, so ist es $vm_ds->[0], die in ManagedObjectReference gesegnet ist. Sie können das value Feld extrahieren $vm_ds->[0]{value} verwenden, aber es ist sehr falsches Objekt atributes wie diese direkt zugreifen zu können, und entsprechen ein eigenes Attribut

bless ist Perls objektorientierter Mechanismus für den Zugriff auf und die Klasse, die ein Datenelement bless in gibt an, welches Perl-Paket die Methoden und Daten für die Klasse enthält

Irgendwo haben Sie eine .pm Datei mit package ManagedObjectReference und eine Reihe von Unterprogrammen, die die Methoden für die Klasse sind. Diese liefern die offizielle Schnittstelle zur Klasse, und wenn Sie Glück haben, gibt es eine value Methode, die die Accessor-Methode für das value Attribut ist. Versuchen Sie $vm_ds->[0]->value() und sehen, ob das funktioniert, andernfalls müssen Sie die Dokumentation für Ihre ManagedObjectReference Klasse lesen

+0

Ja, Sie haben recht, und wenn die Dokumentation verständlich wäre, würde ich. Wenn ich eine Chance bekomme, werde ich versuchen, den Code zu lesen, da die Accessoren wahrscheinlich nicht zu schwer sein werden. – abatie

Verwandte Themen