我正在处理一个SOAP API,它可以返回散列或散列数组,具体取决于是否有一个或多个记录。这使得迭代过程变得棘手。我当前的方法是检查返回的ref,如果它是一个数组,则将其复制到数组中,否则将其推送到数组上然后迭代它。是否有更清洁的习惯用法?
my @things;
if ( ref $result->{thingGroup} eq 'ARRAY' ) {
@things = @{ $result->{thingGroup} };
} elsif ( ref $result->{thingGroup} eq 'HASH' ) {
push @things, $result->{thingGroup};
}
foreach my $thing (@things) { ... }
答案 0 :(得分:4)
与@ cjm的答案类似,但使用ternary operator:
my $things = ref $result->{thingGroup} eq 'ARRAY'
? $result->{thingGroup}
: [ $result->{thingGroup} ];
答案 1 :(得分:2)
我会使用数组引用来避免不必要的副本:
my $things = $result->{thingGroup};
unless (ref $things eq 'ARRAY' ) {
$things = [ $things ];
}
foreach my $thing (@$things) { ... }
我删除了elsif
,因为它不清楚是否添加了任何内容。如果你想确保一个非数组实际上是一个哈希,那么你也应该有一些代码来处理它不是的情况。