[英]Can you force either a scalar or array ref to be an array in Perl?
我有一个从服务返回的 perl 变量$results
。 该值应该是一个数组,而$results
应该是一个数组引用。 但是,当数组中只有一项时, $results
将设置为该值,而不是包含该项的引用数组。
我想对预期的数组执行foreach
循环。 在不检查ref($results) eq 'ARRAY'
,有什么办法可以得到与以下内容等效的内容:
foreach my $result (@$results) {
# Process $result
}
该特定代码示例可用于参考,但会抱怨简单标量。
编辑:我应该澄清一下,我无法更改从服务返回的内容。 问题是当只有一个值时该值将是一个标量,当有多个值时它将是一个数组引用。
我不确定还有其他方法:
$result = [ $result ] if ref($result) ne 'ARRAY'; foreach .....
另一个解决方案是将调用包装到服务器并让它总是返回一个数组来简化你的余生:
sub call_to_service
{
my $returnValue = service::call();
if (ref($returnValue) eq "ARRAY")
{
return($returnValue);
}
else
{
return( [$returnValue] );
}
}
然后,您总是可以知道您将获得对数组的引用,即使它只是一个项目。
foreach my $item (@{call_to_service()})
{
...
}
好吧,如果你不能做...
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()示例中将其抽象出来。
我会重新考虑循环中的代码然后做
if( ref $results eq 'ARRAY' ){
my_sub($result) for my $result (@$results);
}else{
my_sub($results);
}
当然,如果循环中的代码不重要,我只会这样做。
我刚刚测试过这个:
#!/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"; }
它似乎工作正常,所以我认为它与从服务返回的结果有关? 如果你无法控制返回的服务,这可能很难破解
你可以这样做:
my @some_array
push (@some_array, results);
foreach my $elt(@some_array){
#do something
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.