为什么'1'被映射到perl中的hash?

dgB*_*gBP 2 mapping perl hash

我有一些像这样的代码:

print "key $_ - $hJobT{$_}\n" foreach keys %hJobT;
%hJobT = map { $_ => 1 } %hJobT;
print "key $_ - $hJobT{$_}\n" foreach keys %hJobT;
Run Code Online (Sandbox Code Playgroud)

当我运行程序并打印结果时,我得到:

key office - 1
key recon - 1
key office - 1
key 1 - 1
key recon - 1
Run Code Online (Sandbox Code Playgroud)

前两个结果来自第一个print语句并且是预期的.

key 1 - 1部分不是预期的.

为了澄清 - 代码处于一个循环中,当它迭代时,键值在某些条件下递增.出于测试目的,我在循环结束处放置了一个exit语句,因此它只显示第一个迭代结果,因此乳清它们为'1'.(就这样我似乎没有毫无意义地将1s映射到1s.)有关为什么我得到1-1映射的任何想法?

amo*_*mon 12

哈希是偶数值列表.因此,在列表上下文中使用它时,您将获得所有这些键和值:

@list = qw(a b);
%hash = @list;   # valid!
@list = %hash;   # valid, but bad style. And the ordering may change
Run Code Online (Sandbox Code Playgroud)

因此,当您使用散列作为arg时map,您创建了以下列表:

(
   office => 1,
   1      => 1,
   recon  => 1,
   1      => 1
)
Run Code Online (Sandbox Code Playgroud)

因为map

("office", 1, "recon", 1)
Run Code Online (Sandbox Code Playgroud)

因为它是列表参数.

  • @bladepanthera两个`1'都是`map`,但重复的键被丢弃了. (3认同)
  • 啊啊,应该有那个.必须是我头上的星期五效应.干杯! (2认同)