我对Perl的“地图”功能有一些疑问。
具体做法是:
如何
%hash = map {$ _ => 1} @array
创建哈希映射数组的元素为1?块如何返回两个元素的列表?我以为block返回它的最后一个值。是=>隐式创建一个列表,而不是“,”返回其正确的参数?
为什么
%hash = map($ _ => 1),@ array
不行吗?我试图在这里返回两个元素的列表......在解析器的角度来看,在“(”修复它之前如何预先加上“+”?
答案 0 :(得分:9)
问题1:地图块是运行列表上下文,因此允许返回零,一个或多个值。 map
全部归还。 “,
”或“=>
”在标量上下文中返回其右侧,但在列表上下文中返回双方。有关详细信息,请参阅perlop。
问题2:%hash = map ($_ => 1), @array
被解释为%hash = (map($_, 1), @array)
。换句话说,它返回(1,@ array)。
在%hash = map +($_ => 1), @array
中,+表示()不引用参数列表,因此它被解释为map(+($ _ => 1),@ array);
当天的教训:始终在地图表达中使用赞美,这样你就不会被这些问题所困扰。
答案 1 :(得分:4)
添加@ Leon的正确答案,以帮助您解决第二个问题:
来自perlop
一元“+”无效, 甚至在琴弦上。它是有益的 语法上用于从括号中分隔函数名称 表达式,否则将被解释为完整列表 函数参数。
您可以使用deparse来查看perl如何解释每个:
perl -MO=Deparse,-p -e "%h = map ($_ => 1), @a;"
(((%h) = map($_, 1)), @a);
其中
perl -MO=Deparse,-p -e "%h = map +($_ => 1), @a;"
((%h) = map(($_, 1), @a));
我希望这会有所帮助
答案 2 :(得分:0)
第一个参数是代码块或子例程。代码块必须由{}包围。他们的工作不像lambdas,但非常接近。
编辑:不知道为什么在1之后添加+。也许它以某种奇怪的方式编译代码块?这似乎与perldoc不匹配。
答案 3 :(得分:0)
Map将块应用于数组/列表中的每个值,并创建一个新列表。 =>是语法糖,表明该列表由键/值对组成(IIRC,它也适用于普通的逗号)。将hashatig键/值对列表分配给哈希变量时,会创建哈希表。
另一个变体不起作用,因为它不是代码块。我不知道关于+。