2016-06-03 13 views
0

ich ein Anfänger in Perl bin, muss ich die Größe eines Arrays CodeWie die Anzahl der Elemente in einer Liste innerhalb eines Objekts erhalten

SOAP Beratung bekommen als

my @params = (
    SOAP::Data->name(user => '2355'), 
    SOAP::Data->name(psw => '2355') 
); 

my $soap = SOAP::Lite 
    ->uri('https://service.example.com') 
    ->on_action(sub { join '/', 'https://service.example.com', $_[1] }) 
    ->proxy('https://service.example.com/service.php?wsdl'); 

my $method = SOAP::Data->name('GetAll') 
    ->attr({xmlns => 'https://service.example.com'}); 

my @products = $soap->call($method => @params)->result; 

folgt dieser kehrt

$VAR1 = bless({ 
    date_end => [0, 0, "2016-06-30"], 
    dispach => [0, 51, 0], 
    manufacturer => ["Microsoft", "Lenovo", "HP"], 
    sku => [ 
    "R23649C   ", 
    "DW47-03   ", 
    "YDG-016   ", 
    ], 
    tree => [ 
    "MS-OPEN    ", 
    "LENOVO-AIO   ", 
    "HP ACADEMIC ", 
    ], 
}, "parametros_salida"); 

I

print $products->{"sku"}[0]; 
print $products->{"manufacturer"}[0]; 
print $products->{"manufacturer"}[1]; 
die Daten mit

zugreifen können

Aber ich kann nicht als Ergebnis meines Aufrufs zählen SOAP nur eine einzige Variable Dumper ($ Produkte) zurückgeben daher kann ich nicht die Array-Größe.

Ich habe versucht,

my @products2 = $products 
print 0 + @products2; 
print scalar(@products2); 
print scalar $products; 
+4

Sie sollten in die Interna von Objekten (Dinge, die 'bless'ed wurden) nicht herum Stossen lesen sollte. Stattdessen sollten Sie die Methoden des Objekts verwenden, um auf die Daten zuzugreifen, die veröffentlicht werden sollen.Können Sie bitte die gesamte Ausgabe in Ihre Frage bearbeiten, damit wir sehen können, um welche Art von Objekt es sich handelt? – ThisSuitIsBlackNot

Antwort

3

EDITWie andere haben darauf hingewiesen, für dieses spezielle Beispiel - wenn Ihre Hashreferenz in der Tat eine gesegnete Referenz ist (das heißt, zu sagen, ein Objekt), sollten Sie die API der Klasse verwenden, um ihre Mitglieder zu erhalten und nicht in die Interna der Objekte zu graben.

Was folgt, ist eine allgemeine Antwort, die erklärt, wie eine äquivalenteunblessedPerl-Datenstruktur für den Zugriff auf und ist nicht direkt relevant für Ihre Situation



$products und @products sind zwei völlig unabhängige Variable s. Sie haben nichts miteinander zu tun.

Angenommen, dass $products die Variable ist, die Sie an Data::Dumper übergeben haben, um diese Ausgabe zu erhalten, dann ist $products eine Referenz auf einen Hash. Es ist kein Array, also bin ich mir nicht sicher, was Sie meinen, wenn Sie nach der "Array-Größe" fragen.

können Sie herausfinden, wie viele Schlüssel in der Hash sind, dass $products Referenzen unter Verwendung von:

my $key_count = keys %{$products} 

Oder wenn Sie die Größe des einer des Arrays innerhalb des Hash wollen, dass $products Referenzen, wie manufacturer können Sie tun:

my $size = @{ $products->{manufacturer} } 

Sie mehr über Perl Referenzen und Datenstrukturen in Perl aus der Dokumentation Perl references and nested data structures und Perl Data Structures Cookbook, die Bestandteil eines jeden Stand lernen kann, ist, ard Perl-Distribution

Für die richtige Beratung über Ihre Situation Sie Object-Oriented Programming in Perl Tutorial

+6

Sie sollten laut warnen, dass dies die Einkapselung unterbricht; Objekt Methoden sollten auf eine gesegnete Sache verwendet werden. Andernfalls, wenn der Autor irgendwelche Interna ändert, bricht der Code ab. – stevieb

+1

@stevieb Messepunkt, entsprechend aktualisiert. –

+0

Mein Ergebnis ist der Kipper von $ products – nasatome

Verwandte Themen