2012-03-07 55 views
1

這裏是小碼與列表哈希分配::的Util

use List::Util qw(first); 

my $x = {FOO => undef}; 
my @array = (1,2,3,4,5,6,7,8,9); 

$x->{FOO} = 
    { 
     'INFO' => first { $_ eq 1 } @array, 
     'TI' => first { $_ eq 2 } @array, 
    }; 

這不是創建嵌套哈希 - 匿名hashref FOO只有一個密鑰對。這是O/p

$VAR1 = { 
      'FOO' => { 
        'INFO' => 1 
        } 
     }; 

我無法想象爲什麼會發生這種情況?請幫忙。

回答

3

first函數的原型爲&@,這意味着它需要一個塊和一個列表作爲參數。該塊之後的所有內容都用作列表。因此,你的代碼就相當於:

$x->{FOO} = {  
    'INFO' => first { $_ eq 1 } (@array, 'TI' => first { $_ eq 2 } @array), 
}; 

您可以把整個first表達括號,或使用匿名子:

$x->{FOO} = { 
    'INFO' => first(sub { $_ eq 1 }, @array), 
    'TI' => first(sub { $_ eq 2 }, @array), 
}; 
+1

這是一個語法錯誤 - 陣列發現的,其中運營商有望.. .. – rpg 2012-03-07 10:04:50

+0

@rpg:奇怪。例如,'map'不支持該語法。 – 2012-03-07 10:19:37

+1

更簡單的方法是將匿名子傳遞給'first':'INFO => first(sub {$ _ eq 1},@array),'等等 – Borodin 2012-03-07 10:21:47