我有一个从服务返回的perl变量$results 该值应该是一个数组, $results应该是一个数组引用。 但是,当数组中只有一个项时, $results将设置为该值,而不是包含该项的引用数组。

我想在预期的数组上做一个foreach循环。 如果没有检查ref($results) eq 'ARRAY' ,有没有办法得到与以下内容相同的东西:

foreach my $result (@$results) {
    # Process $result
}

该特定代码示例将用于参考,但会抱怨简单的标量。

编辑:我应该澄清,我无法更改从服务返回的内容。 问题是当只有一个值时,该值将是一个标量,当有多个值时,它将是一个数组引用。

===============>>#1 票数:26 已采纳

我不确定还有其他方法:

 $result = [ $result ] if ref($result) ne 'ARRAY'; foreach ..... 

===============>>#2 票数:12

另一个解决方案是将调用包装到服务器并让它总是返回一个数组来简化你的余生:

sub call_to_service
{
    my $returnValue = service::call();

    if (ref($returnValue) eq "ARRAY")
    {
        return($returnValue);
    }
    else
    {
       return( [$returnValue] );
    }
}

然后,您总是可以知道您将获得对数组的引用,即使它只是一个项目。

foreach my $item (@{call_to_service()})
{
  ...
}

===============>>#3 票数:2

好吧,如果你不能做...

for my $result ( ref $results eq 'ARRAY' ? @$results : $results ) {
    # Process result
}

或这个...

for my $result ( ! ref $results ? $results : @$results ) {
    # Process result
}

然后你可能要尝试像这样毛茸茸的东西!....

for my $result ( eval { @$results }, eval $results ) {
    # Process result
}

为了避免这种危险的字符串评估它变得非常难看!

for my $result ( eval { $results->[0] } || $results, eval { @$results[1 .. $#{ $results }] } ) {
    # Process result
}

PS。 我的偏好是在reatmon给出的sub ala call_to_service()示例中将其抽象出来。

===============>>#4 票数:0

我会重新考虑循环中的代码然后做

if( ref $results eq 'ARRAY' ){
    my_sub($result) for my $result (@$results);
}else{
    my_sub($results);
}

当然,如果循环中的代码不重要,我只会这样做。

===============>>#5 票数:0

我刚刚测试过这个:

 #!/usr/bin/perl -w use strict; sub testit { my @ret = (); if (shift){ push @ret,1; push @ret,2; push @ret,3; }else{ push @ret,"oneonly"; } return \\@ret; } foreach my $r (@{testit(1)}){ print $r." test1\\n"; } foreach my $r (@{testit()}){ print $r." test2\\n"; } 

它似乎工作正常,所以我认为它与从服务返回的结果有关? 如果你无法控制返回的服务,这可能很难破解

===============>>#6 票数:0

你可以这样做:

my @some_array
push (@some_array, results);
foreach my $elt(@some_array){
  #do something
}

  ask by Rudd Zwolinski translate from so

未解决问题?本站智能推荐: