print的首字为括号时为何忽略掉下面的内容?

print的首字为括号时为何忽略掉下面的内容?

为什么($y*3)放前面就达不到想要的效果呢?

[Copy to clipboard] [ - ]
CODE:
#!/perl/bin/perl
use strict;

my @t=(1,2,3,4,5,6,7,8);
my $y;
foreach $y(0..$#t)
{
    print ($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n";
}

结果:
036912151821

[Copy to clipboard] [ - ]
CODE:
#!/perl/bin/perl
use strict;

my @t=(1,2,3,4,5,6,7,8);
my $y;
foreach $y(0..$#t)
{
    print "".($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n";
}

结果:
0       1       2
3       4       5
6       7       8
9       10      11
12      13      14
15      16      17
18      19      20
21      22      23
print ($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n";

这个语句的实际效果是print ($y*3)的返回结果再连接上字符串"\t".($y*3+1)."\t".($y*3+2)."\n"
落叶季节,思念季节
Perl 的内置函数(操作符/有名运算符),可以带括号,可以不带括号。
你要搞清楚你的括号是给谁用的。


QUOTE:
原帖由 con 于 2008-11-2 20:08 发表
print ($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n";

这个语句的实际效果是print ($y*3)的返回结果再连接上字符串"\t".($y*3+1)."\t".($y*3+2)."\n"

如果是连上字符串为何后面的字符串一个也没打印出来?

发现这样也是可以的:
    print (($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n");



QUOTE:
原帖由 dl0622 于 2008-11-2 20:25 发表

如果是连上字符串为何后面的字符串一个也没打印出来?

发现这样也是可以的:
    print (($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n");

因为print接受1个列表作为参数, 语句print ($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n"; 中 ($y*3)已经是1个列表了, 所以只打印($y*3), 后面的东西就被print忽略了.

而在语句print (($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n");中, (($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n")是print后面的第一个列表, 所以会把整个($y*3)."\t".($y*3+1)."\t".($y*3+2)."\n"都打印出来.

建议楼主好好研究下Perl的上下文和函数参数
落叶季节,思念季节
这个和上下文关系不大。主要是括号的省略带来的问题。
用我们 FP 的话说,就是:function apply 的优先级是最高的,要高于字符串连接(.)
要想让字符串连接先于 print 函数的 function apply 操作执行,
那么就必须要加括号。
关系很大, 因为括号()就代表了显式的列表上下文环境, 这个也是Perl和其他语言区别很大的地方.
落叶季节,思念季节
Haskell 里面也是这样的。
putStrLn "hello" ++ "world" 会报类型错误,必须得 putStrLn ("hello" ++ "world") 才行。
其他语言里面小括号()一般只是用来提高被括内容的优先级,但是在Perl里面还有一层含义就是申明了一个列表环境
落叶季节,思念季节
这个圆括号和 list context 真的没关系。只和 function call 语法有关系。可以看一下大骆驼 3.1 节。