(已搞定)请教print的问题,关于逗号和LIST

(已搞定)请教print的问题,关于逗号和LIST

虽然觉得请教print很弱。。但是没法了
看perldoc看不懂了,对LIST context不大明白

是这样的,大致明白了print ""和pirnt ()的区别
但是,不知道能否实现print带逗号表达式的
比如:print "good\n",exit将得不到print效果
如果用print ("good\n"),exit 会报错print (...) interpreted as function #莫非现在perl不支持print作为function形式?
之所以这么做是想实现一句代码执行简单顺序相关操作,不需要使用if(...){...}这样的形式
主要也是看书上有(print(...),return()) if (...)但是我无法实现所困扰

ps. 附上我看不明白的perldoc的部分:
NOTE: If
               FILEHANDLE is a variable and the next token is a term, it may
               be misinterpreted as an operator unless you interpose a "+" or
               put parentheses around the arguments.
               Because print takes a LIST, anything in the LIST is evaluated
               in list context, and any subroutine that you call will have one
               or more of its expressions evaluated in list context.  Also be
               careful not to follow the print keyword with a left parenthesis
               unless you want the corresponding right parenthesis to termi-
               nate the arguments to the print--interpose a "+" or put paren-
               theses around all the arguments.

,语法是这样的, 做这测试吧:

sub func1 {
    print "func1\n";
}
sub func2 {
    print "func2\n";
}

print "good\n", &func1, &func2;

########
func1
func2
good
11
########

明白否?


对exit你可以
print "good\n" || exit;

终于有人回答了,谢谢
虽然还不是很明白
但是看输出结果,发现2个函数依次首先执行了
是否意味着,print执行时,首先对后面的list ”通读”一遍
那我用exit或者return,后面执行了,自然就不会print了<-----我的推测
不过兄弟误解了我那里,exit当然那样用是合适的
但是,我是在函数体中使用,想print以后就return,而不是不成功则exit
还请指教


QUOTE:
原帖由 perljoker 于 2007-9-14 18:48 发表
终于有人回答了,谢谢
虽然还不是很明白
但是看输出结果,发现2个函数依次首先执行了
是否意味着,print执行时,首先对后面的list ”通读”一遍
那我用exit或者return,后面执行了,自然就不会print了

"是否意味着,print执行时,首先对后面的list ”通读”一遍"

-- 对.


"那我用exit或者return,后面执行了,自然就不会print了"

-- 是的.


你的目的是print完成后再return, 那么它们之间是顺承关系:
print("good\n") && return;
或者2句写在一行
print("good\n"); return;
但是千万不要
print "good\n" && return;


QUOTE:
print("good\n") && return;

这样同样会报错print (...) interpreted as function
和print("good\n"),return一样啊

在我的多次试验和参考perldoc和perl语言编程及Lonki兄的一些指导测试下
自己觉得基本上是明白了,也能对应perldoc的说法了

总结如下:
如果print后面紧跟多个类似于参数的东西,默认下print认为是LIST context
就会首先依次“检验”各个列表的表达式,比如我有return,他就会执行了,并且认为真
如:print "good\n",return();先判断"good\n",又由于检验到return,则执行返回了,不会再执行print
若为:print "good\n",print "bad";则先判断"good\n",然后执行print"bad",并且成功,返回1
整个表达式会进一步解析成 print "good\n",1;然后执行print,实际上最后打印效果是:badgood1

若想实现我期望的目的,即执行完print后再执行后面的表达式,像如下形式:
print "$string\n",expression; #我的期望是print以后,执行expression
但是,根据前面的分析,这是没法实现的,他会先解释expression,然后回过来整体解释print

其实原因就是expression进入了第一个print的LIST context
为避免这种错误的context(至少不是我想要的),需要将print看作函数
则采用print("$string\n",expression;的形式,此时成为printExp1,expression2;的形式,就是一个逗号表达式
不会再先去解释expression,而是执行printExp1,然后执行expression2,整个表达式的值为后者的boolean值
也就是实现了我的目的,结果为:good换行bad

但是,如果用了-w,必然报错,如我所说print (...) interpreted as function
实际上,他是告诉说这里print加上了(),被解释为函数,这可能不是你所预期的,比如会这样出错:
print (1+2)*4;   #打印 3!
所以,他只是给出提示说,这种写法很容易造成失误,得不到预期的,然而实际上在我的环境下,实现了我的目的
个人感觉,应该还是属于perl不够完善的地方,还是有想偷懒而不得的地方啊

若如Lonki兄说,这里的逗号改为&&,同样存在同样的报警问题,只要print后面是list形式,你加了()就会报警
看来属于编程风格问题了,看来暂时还是乖乖用if(...){print "I'm lazy. Can you help me?";return;}吧


那个警告是因为 print 的括号没紧挨着 print。警告的含义看来你已经理解了。

print( "hello\n" ), exit; 就不会有警告。

但是很显然,不论是 print( ... ), exit; 还是 print( ... ) && exit;,
都不如写成:
print( ... );
exit;
好。
这也就是为什么有警告的原因————有好好的 print( ... ); exit; 你不去写,非要写成是 print (....), exit; 而且括号又和 print 没有紧挨着,因此解释器怀疑是笔误,好意提醒你一下。
相反,如果括号和 print 紧挨着,那么解释器就认为你是故意那么写的,是知情的,因此也就不再罗索了。

至于你不用 print(...); exit; 而是 print(...), exit; 的目的是为了加修饰符,
那么从编程风格上讲,一个语句中不宜出现两个或者两个以上的动词。
因此你写成
if (...){
    print( ... );
    exit;
}
是最好不过了。
如果你一定要用后缀修饰符的话,
可以这样:

do{ print(...); exit; } if ( ... ):


QUOTE:
原帖由 flw 于 2007-9-15 08:41 发表
那个警告是因为 print 的括号没紧挨着 print。警告的含义看来你已经理解了。

print( "hello\n" ), exit; 就不会有警告。

但是很显然,不论是 print( ... ), exit; 还是 print( ... ) && exit;,
都不如 ...

老大很详细的解释.

空格很容易迷惑人,
去掉空格, 下面2句都不会有警告.
print("good\n"), exit;

print("good\n") && exit;


PS: 推荐书写易读的语法, 而不是一味的精简.

唉。。flw老大真难请呢
不过也终于帮我解答了print (...) interpreted as function之谜
原来那个空格还这么折磨人,一个不小心就加空格。。。
do{ print(...); exit; } if ( ... );
并且原来还这样写的,嗯,记住了
谢谢2位了,能送积分就好了,哈哈
不错,学习了:)