文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Perl中 shift || 35 怎么理解?

Perl中 shift || 35 怎么理解?

时间:2008-11-04  来源:sun9527

转: http://bbs.chinaunix.net/thread-1298466-1-2.html

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

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

其实 shift || 35 这个写法多多少少会有一些不方便的地方,
甚至在有些地方会造成 BUG。

比如下面这一句:

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

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

虽然我们有许多办法可以解决这个问题,
比如书写 fee 的文档、加强沟通、或者更为谨慎的:

CODE:
my $fee = shift;
$fee = 10 if not defined $fee;
不过 Perl6 提供了一个更为方便的办法:

CODE:
my $fee = shift // 10;
用来表达这一逻辑。
这个特性在 Perl 5.10 中就已经被引入了,也将成为 Perl5 后续版本中的一个功能。

[ 本帖最后由 flw 于 2008-10-28 12:24 编辑 ]
排行榜 更多 +
别惹神枪手安卓版

别惹神枪手安卓版

冒险解谜 下载
坦克战争世界

坦克战争世界

模拟经营 下载
丛林反击战

丛林反击战

飞行射击 下载