免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2598 | 回复: 10

为什么 map{$_,0}()正确但map{0,$_}()提示map参数不足? [复制链接]

论坛徽章:
0
发表于 2013-05-16 23:15 |显示全部楼层
本帖最后由 hbmhalley 于 2013-05-16 23:21 编辑

在 Intermediate Perl 中看到的例子
为什么 map{$_,0}() 正确 但 map{0,$_}() 提示 map参数不足 ?
perldoc map 里好像没提一对多的用法
刚看到 perldoc 里说 map{+0,$_}()可以令perl将{}识别为BLOCK
这是个独立的规定吗?

3ks

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2013-05-17 00:01 |显示全部楼层
编译器的限制,可能产生歧义的地方会选择一个实现者认为正确的,其它的就靠+空格之类的区分了

论坛徽章:
0
发表于 2013-05-17 09:38 |显示全部楼层
回复 2# zhlong8


    那么在这里可以认为是实现者猜的或规定的而非推断的吗?
    实在没看出来 {+0,0} 和 {0,0} 如何能区别 BLOCK 与 EXPR

    在 perlop 里确实提过这个问题,解决方案是加个分号 {;0,0}
    但加个加号有什么用呢?经实验,map{+0,0},() 还会报错

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2013-05-17 10:38 |显示全部楼层
hbmhalley 发表于 2013-05-17 05:38
回复 2# zhlong8
  1. map { +0,0 }, () 还会报错
复制代码

{ + => perl guesses BLOCK.
},    => so, wrong!
}     => ok!

论坛徽章:
0
发表于 2013-05-17 12:47 |显示全部楼层
rubyish 发表于 2013-05-17 10:38
{ + => perl guesses BLOCK.
},    => so, wrong!
}     => ok!

所以这都是猜的吗?
那要想确定的解释为EXPR或BLOCK,写成map+{0,0}()和map{;0,0}()可以吗?

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2013-05-17 16:47 |显示全部楼层
hbmhalley 发表于 2013-05-17 08:47
所以这都是猜的吗?
那要想确定的解释为EXPR或BLOCK,写成map+{0,0}()和map{;0,0}()可以吗?

呵呵问版主{:3_188:}

论坛徽章:
0
发表于 2013-05-17 19:01 |显示全部楼层
本帖最后由 picbhan 于 2013-05-17 19:23 编辑
  1.           %hash = map {  "\L$_" => 1  } @array  # perl guesses EXPR.  wrong
  2.                    %hash = map { +"\L$_" => 1  } @array  # perl guesses BLOCK. right
  3.                    %hash = map { ("\L$_" => 1) } @array  # this also works
  4.                    %hash = map {  lc($_) => 1  } @array  # as does this.
  5.                    %hash = map +( lc($_) => 1 ), @array  # this is EXPR and works!

  6.                    %hash = map  ( lc($_), 1 ),   @array  # evaluates to (1, @array)

  7.                or to force an anon hash constructor use "+{":

  8.                   @hashes = map +{ lc($_) => 1 }, @array # EXPR, so needs comma at end

复制代码
我的理解是这样的。

map有两种用法:
map BLOCK LIST
map EXPR,LIST

{}里简单的表达式如map {0,0} () perl会倾向于理解为expr,而把{}当做普通的作用域,因此需要‘,’分隔至少两个参数(如map {0,0}, ()),而{+}或者{}里复杂的表达式会理解为BLOCK,但是+{}会被强制当做EXPR理解。只是这里简单和复杂的表达式不是很好定义,可以这样定义,即任何语法操作(如简单变量{0},{@a},一元的+,强制返回列表的(),函数操作lc,以及‘;’等等)可以当做是复杂的表达式,其余可以当做是简单表达式(如{0,0}等)。

个人理解,勿喷,勿拍砖!

论坛徽章:
0
发表于 2013-05-17 20:07 |显示全部楼层
回复 7# picbhan


    确实不好定义
    实际上,应该是未定义 ...

    我到 stackoverflow 上问了问,问出来了这么一句话
   
It's interesting though that perl -MO=Deparse -e "map { +0,0 } 1..2" outputs something that you can't use in original script.

论坛徽章:
0
发表于 2013-05-18 12:36 |显示全部楼层
回复 8# hbmhalley


    perl真是个奇迹。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2013-05-18 18:07 |显示全部楼层
回复 7# picbhan


    good~3Q~你说的很有道理,非常感谢你。{:3_188:} {:3_188:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP