shift || 35 怎么理解?

shift || 35 怎么理解?

my $max = shift || 35;


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

请赐教初学者。谢谢。
我改从什么地方去查这个的用法。
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 今天怎么脾气这么好呀?】

我之所以为了这么简单的一个问题都肯码这么多字,
是因为我觉得值 ------ 这个帖子的标题写得很清楚,因此以后将会有更多人通过搜索引擎看到我说的话,因此值!
同时,我这么做也是为了鼓励大家,把帖子标题写清楚些。
其实 shift || 35 这个写法多多少少会有一些不方便的地方,
甚至在有些地方会造成 BUG。

比如下面这一句:

[Copy to clipboard] [ - ]
CODE:
sub fee{
    my $money = shift || 10;
    ........

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

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

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

[Copy to clipboard] [ - ]
CODE:
my $fee = shift;
$fee = 10 if not defined $fee;

不过 Perl6 提供了一个更为方便的办法:

[Copy to clipboard] [ - ]
CODE:
my $fee = shift // 10;

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

谢谢耐心指导。


QUOTE:
原帖由 flw 于 2008-10-28 12:22 发表
其实 shift || 35 这个写法多多少少会有一些不方便的地方,
甚至在有些地方会造成 BUG。

比如下面这一句:

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

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

这个特性不错


QUOTE:
原帖由 flw 于 2008-10-28 12:22 发表
其实 shift || 35 这个写法多多少少会有一些不方便的地方,
甚至在有些地方会造成 BUG。

比如下面这一句:

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

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

讲得非常好!
多谢flw,Perl并不是为了简单而简单,清晰是需要关注的地方。