免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2481 | 回复: 7
打印 上一主题 下一主题

shift || 35 怎么理解? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-28 12:02 |只看该作者 |倒序浏览
my $max = shift || 35;


这里 shift || 35 怎么理解呀?

请赐教初学者。谢谢。
我改从什么地方去查这个的用法。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-10-28 12:08 |只看该作者
Perl 代码就是压缩饼干,携带方便,吃起来也省事,但就是不好消化,因为每一句都是浓缩的。

shift || 35 就是【先 shift,如果 shift 不出看起来为“真”的东西,那么就取 35。】
语法上和 $foo || 35 没什么分别。都是利用了 || 这个运算符可以短路求值并返回为真的那个操作数这一特点。

但是 shift 又是什么意思呢?
shift 其实是 shift @ARGV 或者 shift @_ 的缩写。
就是一个很常见的数组操作,和 shift @foo 是一个语法。
至于到底是哪个的缩写,主要看 shift 出现在什么地方。
如果出现在 sub 里面,就是 shift @_,否则就是 @ARGV。


BTW:如果你连 shift @foo 都看不懂,那就说明还没认真学过 Perl,找一本《Perl 入门》好好学学。

[ 本帖最后由 flw 于 2008-10-28 12:11 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-10-28 12:10 |只看该作者
有些不和谐的人也许又该说了,【flw 今天怎么脾气这么好呀?】

我之所以为了这么简单的一个问题都肯码这么多字,
是因为我觉得值 ------ 这个帖子的标题写得很清楚,因此以后将会有更多人通过搜索引擎看到我说的话,因此值!
同时,我这么做也是为了鼓励大家,把帖子标题写清楚些。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2008-10-28 12:22 |只看该作者
其实 shift || 35 这个写法多多少少会有一些不方便的地方,
甚至在有些地方会造成 BUG。

比如下面这一句:

  1. sub fee{
  2.     my $money = shift || 10;
  3.     ........
复制代码


比如这个 10 块钱好比是一个缺省的费用,
如果调用 fee 时没有提供这个参数,那么就认为是 10 块钱。
也许通常都是 10 块钱,这样编码时可以少输入不少 10,
但是如果上层业务逻辑决定要对某个客户实行一个特别的收费标准,那么可以在调用时传递参数:
fee(5);
这样就可以把收费标准降低成 5 块钱了(VIP?)

这时候,问题出现了:如果我们想要给客户免费服务呢?
假设 fee 的实现者和调用者是两个 team 的人,
那么也许书写上层业务逻辑的那位程序员可能会想当然地写:
fee(0);
错误已经发生了!
因为这样会对这位客户计费 10 块钱。

虽然我们有许多办法可以解决这个问题,
比如书写 fee 的文档、加强沟通、或者更为谨慎的:
  1. my $fee = shift;
  2. $fee = 10 if not defined $fee;
复制代码

不过 Perl6 提供了一个更为方便的办法:
  1. my $fee = shift // 10;
复制代码

用来表达这一逻辑。
这个特性在 Perl 5.10 中就已经被引入了,也将成为 Perl5 后续版本中的一个功能。

[ 本帖最后由 flw 于 2008-10-28 12:24 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-10-28 13:11 |只看该作者

回复 #3 flw 的帖子

谢谢耐心指导。

论坛徽章:
0
6 [报告]
发表于 2008-10-28 15:11 |只看该作者
原帖由 flw 于 2008-10-28 12:22 发表
其实 shift || 35 这个写法多多少少会有一些不方便的地方,
甚至在有些地方会造成 BUG。

比如下面这一句:

sub fee{
    my $money = shift || 10;
    ........

比如这个 10 块钱好比是一个缺省的 ...

这个特性不错

论坛徽章:
0
7 [报告]
发表于 2008-10-29 22:31 |只看该作者
原帖由 flw 于 2008-10-28 12:22 发表
其实 shift || 35 这个写法多多少少会有一些不方便的地方,
甚至在有些地方会造成 BUG。

比如下面这一句:

sub fee{
    my $money = shift || 10;
    ........

比如这个 10 块钱好比是一个缺省的 ...

讲得非常好!

论坛徽章:
0
8 [报告]
发表于 2008-10-30 09:52 |只看该作者

回复 #4 flw 的帖子

多谢flw,Perl并不是为了简单而简单,清晰是需要关注的地方。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP