Когда в очередной раз нонадобилось написать что-то вроде «если пользователь передал ссылку на список, то раскрыть в список, если ссылку на хеш - раскрыть в хеш, иначе - вернуть пустой список» - меня внутренне передёрнуло от 100500-й уродливой конструкции с вложенными iif'ами (которые «condition?valIfTrue:valIfFalse») - и я накатал вот это.
Понимаю, что говнокод, но, блин, мне он кажется дико симпатичным :)
sub deref2list {
({'ARRAY'=>sub{ @{$_[0]} },'HASH'=>sub { %{$_[0]} } }->{ref $_[0]} || sub {()})->($_[0])
}
Классический пример применения - ситуации когда нужно либо добавить в хеш переданные пользователем дополнительные параметры (если это ссылка на массив или на хеш), либо... ничего не добавлять.
Как-то так:
my $l=[
{"e"=>"Estonia","f"=>"Finland"},
["g"=>"Gvinea-Bissau","h"=>"Holland"],
"Moonland",
sub { "MGIMO forever" }
];
my %h=("a"=>"Angola",map deref2list($_), @{$l});