2012-03-07 60 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