我有这段代码:
my %events = ();
map { $events{$_} => 1 } @event_ids;
map { $events{$_} => 2 } @teen_event_ids;
map { $events{$_} => 3 } @kids_event_ids;
虽然数组有数据,但%events
的内容却变空了。
答案 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是针对青少年活动还是儿童活动,并根据需要返回1
,2
或3
。
答案 2 :(得分:-2)
好的,是时候睡觉了。应该只使用=
而不是胖箭头=>
。