Perl 小测验

Perl 小测验

Perl 小测验
http://www.fayland.org/journal/Quiz.html

目前我正处于收集中。收集了我看得过去的六个小测试,各位可以试试。
不帖过来是因为转换格式挺麻烦的。

有好的测试题请发email到 fayland_at_fayland_org

Have fun. :)
挺有意思的,前...
挺有意思的,前面几个还好...最后一个 ‘print ++$i, $i++;’的确也有点蹊跷
执行的流程似乎等效为:
++$i --> $i++ --> print $i --> print $i-1 (这个$i-1的值就是上面$i++保存的值);

看来$i++和++$i保存在不同的地方(++$i直接修改了$i,而$i++修改了$i,并且把当前的$i值保存在另一个地方)...

看看我试的下面这段代码:

$i=1;print ++$i,print $i,$i++;

像上面一样,流程可能等效为:

$i=1 --> ++$i --> $i -->$i++ (此时$i的值已经变成了3,但是这个$i++仍然是2)--> print $i --> print $i-1
--> print $i -->print 1 (这里的1是“print $i,$i++"执行成功的状态码)

fayland认为如何?




   

“,” 是左结合...
“,” 是左结合的,所以,print ++$i, $i++; 会先处理 “$i++”。
$i = 1;--pri...
$i = 1;
print $i++, ++$i;
$i = 1;
print ++$i, $i++;
输出1332

这个左结合的话第一项怎么解释?

问我想法?我还没想通呢。

不过print ++$i 和print $i++ 的区别是知道的,
++$i 是先做加加然后输出,$i++是先做输出再++




   

cnhacktnt 的解...
cnhacktnt 的解释我看来起也很糊涂。
如果把第一个也用你那个解释解释好像不通
而且最后不会有print 1 (这里的1是“print $i,$i++"执行成功的状态码)
因为我们只有一个print
pugs 中--my ...
pugs 中
my $i = 1;
say ++$i, $i++; # 2 2
输出的跟perl5不一样
试一下在各个不...
试一下在各个不同的版本运行一下,看看结果是否一样???
[quote]回复给 ...
[quote]回复给 fayland : cnhacktnt 的解......[/quote]

[b]“如果把第一个也用你那个解释解释好像不通”[/b]

我们知道'$i=1;print $i++;'会输出1,然后$i自增1;

$i=1;print ++$i, $i++;

$i先自增1,此时$i=2,然后执行$i++,此时会保存当前的$i=2的值到某个地方作为print的参数,然后$i再自增1,变成$i=3,而第一个print ++$i打印的就是当前$i的值,所以输出32


[b]“而且最后不会有print 1 (这里的1是“print $i,$i++"执行成功的状态码)”[/b]

$i=1;print ++$i,print $i,$i++;

先$i自增1,此时$i=2,然后转到后面的print $i,$i++; 前一个$i仍然等于2,后面的$i++会先保存当前的值2作为print的第二个参数,然后自增1,这次自增就导致程序中的$i变成了3,而第一个print ++$i其实打印的是当前$i的值。
这行代码会输出3231,其中32是print $i,$i++的输出,31是print ++$i,(print $i,$i++)的输出,后面的1是(print $i,$i++)成功执行的状态码,你可以实验的,无论把$i的初始值设为多少,或者把$i++改成$i+=2,最后一位输出仍然会是1.

我的想法:
print ++$i 实际上是 $i=$i+1;print $i;

而 print $i++; 看起来像是 print $i;$i=$i+1 (实际上也可能是这样)

但是在这个quiz中,print ++$i,$i++稍微特殊一点 ,也就是$i++会把自增前的$i值保存在某个地方作为print的参数,然后再自增,所以print ++$i,$i++ 后面输出的2并不是$i的最后值,而是$i自增前的,保存在某个地方的值。

不知道这样讲是否能明白?这也只是我的猜测






   

$i=1;print joi...
$i=1;print join(' ',$i++,$i++,$i++,$i++,$i++,++$i,++$i,++$i,++$i,++$i)
输出:1 2 3 4 5 11 11 11 11 11
$i=1;print join(' ',$i++,$i++,++$i,$i++,$i++,++$i,++$i,$i++,++$i,++$i)
输出:1 2 11 4 5 11 11 8 11 11
如果“++”在前面,输出整个列表所自加的总和;如果“++”在后,则根据从左到右相加次数输出……
http://groups-...
http://groups-beta.google.com/group/perl.perl6.compiler/browse_thread/thread/6aabbd159cd813d9/f5a4ed7a1b18b451#f5a4ed7a1b18b451