您可以将标量或数组引用强制为Perl中的数组吗?

您可以将标量或数组引用强制为Perl中的数组吗?

Can you force either a scalar or array ref to be an array in Perl?

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

我想对期望的数组做一个foreach循环。 不检查ref($results) eq 'ARRAY',是否有任何等同于以下内容的方法:

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

那个特定的代码示例可以用作参考,但是会抱怨简单的标量。

编辑:我应该澄清,我没有办法更改从服务返回的内容。 问题在于,当只有一个值时,该值将为标量;而当存在多个值时,该值将为数组引用。


我不确定除了以下以外还有其他方法:

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


另一个解决方案是将调用包装到服务器,并使其始终返回一个数组以简化您的余生:

1
2
3
4
5
6
7
8
9
10
11
12
13
sub call_to_service
{
    my $returnValue = service::call();

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

这样,您始终可以知道您将获得对数组的引用,即使它只是一项。

1
2
3
4
foreach my $item (@{call_to_service()})
{
  ...
}

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

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

或这个...

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

那么您可能必须尝试一些像这样的令人毛骨悚然的东西!

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

为了避免危险的字符串评估,它变得非常丑陋!

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

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


您可以这样做:

1
2
3
4
5
my @some_array
push (@some_array, results);
foreach my $elt(@some_array){
  #do something
}

我将在循环内重构代码,然后执行

1
2
3
4
5
if( ref $results eq 'ARRAY' ){
    my_sub($result) for my $result (@$results);
}else{
    my_sub($results);
}

当然,只有在循环中的代码不平凡的情况下,我才会这样做。


我刚刚用以下方法进行了测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/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\
"
;
}
foreach my $r (@{testit()}){
   print $r." test2\
"
;
}

而且似乎工作正常,所以我认为这与从服务中返回结果有关吗?
如果您无法控制退货服务,那么可能很难破解


推荐阅读

    金蝶易记账售后服务电话

    金蝶易记账售后服务电话,,1.人工客服电话是多少075客服专线075-5292 22668*QQ公司人工客服专线:075-5292 22668【24小时服务热线】你好一一

    Win7系统如何架设代理服务器

    Win7系统如何架设代理服务器,代理服务器,端口,本文目录Win7系统如何架设代理服务器Win7系统怎么设置代理服务器win7的网络代理设置在哪里

    中柏电脑售后服务点|中柏售后电话

    中柏电脑售后服务点|中柏售后电话,,1. 中柏售后电话1.长得很霸气,用起来也很好用,笔记本性能很强悍,开机速度都挺好。2.用了一段时间感觉运行

    16天的最新的内存引用:4gb上涨10元

    16天的最新的内存引用:4gb上涨10元,,内存价格上涨到4GB 10元 在今天中关村的现货市场,内存价格总体呈发展趋势,但它是小的。内存市场昨日下

    服务器设置家|服务器管理器设置

    服务器设置家|服务器管理器设置,,1. 服务器管理器设置Windows10打开服务管理器的方法:方法一、运行打开服务的命令services.msc打开“运行

    wps如何生成引用

    wps如何生成引用,WPS教程,1.wps怎么添加引用文献wps添加引用文献:1、打开文档,点击WPS文字右侧下拉菜单。2、打开插入>引用>脚注与尾注3、选