Как работать с переменным хеш-значением

Я имею дело с SOAP API, который может возвращать хеш или массив хэшей в зависимости от того, есть ли одна или несколько записей. Это усложняет повторение возврата. Мой текущий метод - проверить ссылку возврата и либо скопировать ее в массив, если это массив, либо поместить ее в массив, а затем выполнить итерацию по ней. Есть ли более чистая идиома для использования?

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) { ... }

person SparkeyG    schedule 08.01.2016    source источник
comment
Вы используете XML::Simple? Если это так, вам следует включить его :строгий режим. Кроме того, не используйте XML::Simple.   -  person Grant McLean    schedule 08.01.2016
comment
Нет, я использую SOAP::Lite, который использует XML::Parser под капотом.   -  person SparkeyG    schedule 08.01.2016


Ответы (2)


Аналогично ответу @cjm, но с использованием тернарного оператора:

my $things = ref $result->{thingGroup} eq 'ARRAY'
    ? $result->{thingGroup}
    : [ $result->{thingGroup} ];
person stevieb    schedule 08.01.2016

Вместо этого я бы использовал ссылку на массив, что позволяет избежать ненужной копии:

my $things = $result->{thingGroup};
unless (ref $things eq 'ARRAY' ) {
    $things = [ $things ];
} 

foreach my $thing (@$things) { ... }

Я удалил elsif, потому что неясно, что он что-то добавляет. Если вы хотите убедиться, что не-массив на самом деле является хэшем, у вас также должен быть некоторый код для обработки случая, когда это не так.

person cjm    schedule 08.01.2016