在void上下文中使用map?

时间:2016-02-16 07:13:50

标签: perl

我有这段代码:

my %events = (); 
map { $events{$_} => 1 } @event_ids;
map { $events{$_} => 2 } @teen_event_ids;
map { $events{$_} => 3 } @kids_event_ids;

虽然数组有数据,但%events的内容却变空了。

3 个答案:

答案 0 :(得分:4)

%events未被更改,因为您甚至从未尝试更改%events(除非在空白时将其清空)!我认为你打算这样做

my %events; 
map { $events{$_} = 1 } @event_ids;
map { $events{$_} = 2 } @teen_event_ids;
map { $events{$_} = 3 } @kids_event_ids;

在void上下文中使用map是不受欢迎的。以下更为熟悉:

my %events = (
   ( map { $_ => 1 } @event_ids ),
   ( map { $_ => 2 } @teen_event_ids ),
   ( map { $_ => 3 } @kids_event_ids ),
);

my %events; 
$events{$_} = 1 for @event_ids;
$events{$_} = 2 for @teen_event_ids;
$events{$_} = 3 for @kids_event_ids;

从技术上讲,你可以在map的操作数(map( BLOCK LIST ))周围使用parens,但它看起来很奇怪,所以我把parens放在整个map周围。

答案 1 :(得分:1)

那......并不是map打算使用的方式。它将列表转换为不同的列表并返回结果列表。这并不意味着就地更改列表(或哈希)。

请改为尝试:

my %events = (); 
$events{$_} = 1 for @event_ids;
$events{$_} = 2 for @teen_event_ids;
$events{$_} = 3 for @kids_event_ids;

或者,如果您特别想要包含map

my %events = map { $_ => 1 } @event_ids;
$events{$_} = 2 for @teen_event_ids;
$events{$_} = 3 for @kids_event_ids;

甚至:

my %events = map { $_ => find_event_category($_) } @event_ids, @teen_event_ids, @kids_event_ids;

其中find_event_category是一个函数,用于确定id是针对青少​​年活动还是儿童活动,并根据需要返回123

答案 2 :(得分:-2)

好的,是时候睡觉了。应该只使用=而不是胖箭头=>