如何获取对象中列表中的项目数

时间:2016-06-03 18:37:22

标签: perl soap

我是Perl的初学者,我需要获得数组的大小

SOAP咨询代码如下

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;

返回

$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");

我可以使用

访问数据
print $products->{"sku"}[0];
print $products->{"manufacturer"}[0];
print $products->{"manufacturer"}[1];

但是我不能算作调用SOAP的结果只返回单个变量Dumper($ products)因此我无法获得数组大小。

我已经尝试了

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

1 个答案:

答案 0 :(得分:3)

  

编辑 正如其他人所指出的,对于这个具体的例子 - 当您的哈希引用实际上是一个有福的引用(也就是说,一个对象) ),你应该使用类的API来获取它的成员,而不是深入到对象的内部。

     

以下是一个通用答案,解释了如何访问等效的 unblessed Perl数据结构,并且与您的情况无直接关系


$products@products是两个完全不相关的变量。他们有 彼此无关。

假设$products是您传递给Data::Dumper以获取该输出的变量,那么$products是对哈希的引用。它不是一个数组,所以当你要求“数组大小”时,我不确定你的意思。

您可以使用以下命令查看$products引用的哈希中有多少个键:

my $key_count = keys %{$products}

或者如果您想要$products引用的哈希中的一个数组的大小,例如manufacturer,您可以这样做:

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

您可以从文档Perl references and nested data structuresPerl Data Structures Cookbook中了解有关Perl中Perl引用和数据结构的更多信息,这是每个标准Perl发行版的一部分

如果您对自己的情况有适当的建议,请阅读Object-Oriented Programming in Perl Tutorial