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

Perl 如何获取对象中列表中的项数,perl,soap,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:

我是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只返回一个变量转储程序($products),因此我无法获得数组大小

我试过了

my @products2 = $products
print 0 + @products2;
print scalar(@products2);
print scalar $products;
编辑正如其他人所指出的,对于这个特定的示例,当您的哈希引用实际上是一个受祝福的引用(即对象)时,您应该使用类的API来获取其成员,而不是挖掘对象的内部

下面是一个通用的答案,它解释了如何访问等效的非lessedPerl数据结构,并且与您的情况没有直接关系



$products
@products
是两个完全不相关的变量。他们有 彼此之间没有任何关系

假设
$products
是传递给
Data::Dumper
以获得该输出的变量,则
$products
是对散列的引用。它不是一个数组,所以我不知道你问“数组大小”是什么意思

您可以使用以下方法找出
$products
引用的哈希中有多少个键:

my $key_count = keys %{$products}
或者,如果您想要
$products
引用的哈希中的一个数组的大小,例如
manufacturer
,您可以执行以下操作:

my $size = @{ $products->{manufacturer} }
您可以从文档中了解有关Perl引用和Perl数据结构的更多信息,这是每个标准Perl发行版的一部分

关于你的处境,你应该阅读

编辑正如其他人所指出的,对于这个特定的示例,当您的哈希引用实际上是一个受祝福的引用(即对象)时,您应该使用类的API来获取其成员,而不是挖掘对象的内部

下面是一个通用的答案,它解释了如何访问等效的非lessedPerl数据结构,并且与您的情况没有直接关系



$products
@products
是两个完全不相关的变量。他们有 彼此之间没有任何关系

假设
$products
是传递给
Data::Dumper
以获得该输出的变量,则
$products
是对散列的引用。它不是一个数组,所以我不知道你问“数组大小”是什么意思

您可以使用以下方法找出
$products
引用的哈希中有多少个键:

my $key_count = keys %{$products}
或者,如果您想要
$products
引用的哈希中的一个数组的大小,例如
manufacturer
,您可以执行以下操作:

my $size = @{ $products->{manufacturer} }
您可以从文档中了解有关Perl引用和Perl数据结构的更多信息,这是每个标准Perl发行版的一部分


对于你的情况,你应该阅读

你不应该在对象的内部(那些被
祝福
的东西)中到处乱翻。相反,您应该使用对象的方法来访问它想要公开的数据。请您将完整的输出编辑到您的问题中,这样我们就可以看到这是什么类型的对象了?您不应该在对象的内部(已被
bless
ed的对象)中到处乱翻。相反,您应该使用对象的方法来访问它想要公开的数据。你能不能把完整的输出编辑成你的问题,这样我们就可以看到那是什么类型的对象了?你应该大声警告,这样做会破坏封装;对象方法应该用于受祝福的事物。否则,如果作者更改了任何内部代码,代码将被破坏。我的结果将使$products@nasatome:您已经被警告过两次,虽然这是一个快速修复方法,而且可以正常工作,但是您正在使用的模块的作者可能会更改他们的代码,并且您的所有代码都可能会中断,从而导致大量混乱和浪费时间。你最好花点时间看看模块是否有对象方法可以满足你的需要。这可以节省以后重构东西的大量时间。@nasatome:这不是对你问题的好答案。不幸的是,如果没有看到
parametros_salida
类的代码或文档,我们无法提供正确的答案。请不要仅仅因为“有效”就使用此解决方案。相反,您应该问另一个问题,给出模块API的详细信息。您应该大声警告,这样做会破坏封装;对象方法应该用于受祝福的事物。否则,如果作者更改了任何内部代码,代码将被破坏。我的结果将使$products@nasatome:您已经被警告过两次,虽然这是一个快速修复方法,而且可以正常工作,但是您正在使用的模块的作者可能会更改他们的代码,并且您的所有代码都可能会中断,从而导致大量混乱和浪费时间。你最好花点时间看看模块是否有对象方法可以满足你的需要。这可以节省以后重构东西的大量时间。@nasatome:这不是对你问题的好答案。不幸的是,如果没有看到
parametros_salida
类的代码或文档,我们无法提供正确的答案。请不要仅仅因为“有效”就使用此解决方案。相反,您应该问另一个问题,给出模块API的详细信息