“map”如何解释Perl中的第一个参数?

时间:2009-01-13 17:29:21

标签: perl

我对Perl的“地图”功能有一些疑问。

具体做法是:

  • 如何

    %hash = map {$ _ => 1} @array

    创建哈希映射数组的元素为1?块如何返回两个元素的列表?我以为block返回它的最后一个值。是=>隐式创建一个列表,而不是“,”返回其正确的参数?

  • 为什么

    %hash = map($ _ => 1),@ array

    不行吗?我试图在这里返回两个元素的列表......在解析器的角度来看,在“(”修复它之前如何预先加上“+”?

4 个答案:

答案 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键/值对列表分配给哈希变量时,会创建哈希表。

另一个变体不起作用,因为它不是代码块。我不知道关于+。