找回密码
 注册
查看: 2491|回复: 0

perl语言输出到标准输出设备

[复制链接]
发表于 2011-11-13 22:57:15 | 显示全部楼层 |阅读模式
print 操作将传给它的依次输出到标准输出设备中,一个接着一个。不会在这些元素之前,之后,或之中加入任何字符◆。
如果想在其间加入空格,在结尾加入换行符,那需具体指定它:
◆默认情况下,不会加入任何的字符,但这种默认行为(就像Perl 中别的default 一样)是可以改变的。改变这种默认值,可能影响你的维护
人员,因此应当尽量避免它,除非在一些小的,quick-and-dirty 程序,或者程序的一小段中。参看perlvar 的帮助手册,学习改变这种默
认值的方法。
$name = “LarryWall”;
print “Hello there, $name , did you know that 3+4 is”, 3+4, “?\n”;
当然,打印数组和内插一个数组是不同的:
print @array; #打印出元素的列表
print “@array”; #打印一个字符串(包含一个内插的数组)
第一个语句打印出所有的元素,一个接着一个,其中没有空格。第二个打印出一个元素,它为@array 的所有元素,其被存
在一个字符串中。也就是说,打印出@array 的所有元素,并由空格分开◆。如果@array 包含qw /fred barney betty /◆,则
第一个例子输出为:fredbarneybetty,而第二个例子输出为fred barney betty(由空格分开)。
◆是的,空格也为默认值。参见perlval
◆你知道此处我们指的是三个元素的列表,对吧?
在决定使用第二种方法前,想象@array 为一个unchomped 的输入列。也就是说,每一个字符串都有一个换行符作为后缀。
现在第一个print 语句输出为fred, barney, betty,分别在三行中。第二个print 语句输出为:
fred
barney
betty
你知道空格是哪里来的吗?Perl 在内插数组时,它会在元素之间加入空格。我们得到数组的第一个元素(fred 和换行符),空
格,数组的第二个元素(barney 和换行符),空格,数组的最后一个元素(betty 和换行符)。结果是数组除了第一个元素之外
元素都被缩进了。每隔一周或者两周,comp.lang.perl.misc 的新闻组上就会出现如下的消息:
不用阅读这些消息,我们就知道程序中对数组使用了双引号,数组含有unchomped(没有去掉末尾的换行符:译者注)的
字符串。当问到:“你对unchomped 的数组使用了双引号吗?”,答案通常是yes.
如果,字符串包含换行符,如果想输出它们,通常:
print @array;
如果不包含换行符,通常想加上一个:
print “@array\n”;
如果使用了双引号,通常要加上\n。这能帮助你区别开来。
通常,需要把程序的输出先缓存起来。将要输出的内容先缓存起来,等到有足够的内容再输入,而非立刻就输出。例如,
假设要把输出的内容存入磁盘,如果有一个或两个字符就立刻输出到磁盘中,这将非常缓慢和低效。一般,先将要输出的
内容存入一个缓存(buffer)中,当缓存满时,再将其输出。通常,我们希望这样做。
但如果你的程序需要你立刻输出,则希望每一次print 时,就输出。参照Perl 的帮助手册,了解更多的关于控制缓存的信息。
由于print 需要一些输出的字符串列表,则其参数是作为列表context 来求值的。由于<>操作返回的是列表,则它们可很好
的一起工作:
print <>; # ‘cat’的源程序
print sort <>; #‘sort’的源程序
坦白讲,标准Unix 命令cat 和sort 还有些其它功能是上述程序所缺乏的,但不能低估上述程序的价值!现在你可以使用Perl
来实现标准的Unix 工具,再将其移植到任何装有Perl 的机器上,无论上述机器是否运行Unix。并且,上述程序在不同的
机器上有相同的行为◆。
◆事实上,Perl Power Tools(PPT)项目的目标是将所有传统的Unix 工具在Perl 中实现,它们几乎实现了所有的工具(包括大多数的游戏),
当在如何实现shell 时被难住了。PPT 项目是成功的,因为在大多数non-UNIX 系统中实现了标准的Unix 工具。
还有一点需要说明的是,print 还有可选的括号,它在某些时候可能引起混淆。记住Perl 中关于括号的规则:如果括号不能
改变语句的意义,则其就是可选的。下面是输出某个相同语句的不同的方法:
print (“Hello, world!\n”);
pirnt “Hello, world!\n”;
Perl 的另一个规则是:如果调用print 的方法看起来是函数调用,则它就是函数调用。这条规则很简单,但看起来像函数调
用是啥含义呢?
在函数调用中,函数名字后面会紧接着◆括号,其中为函数的参数,如下:
◆我们说“紧接着”,是说Perl 在这类函数调用中,函数名字和开括号之间不能有换行符。如果有换行符,Perl 则将此代码看作列表操作,
而非函数调用。想了解更多的信息,可以参看帮助手册。
print (2+3);
上述代码看起来像函数调用,它实际上就是函数调用。其输出为5,然后返回一个值,这和其它函数调用一样。print 返回
值为true 或者false,表明print 成功或者失败。通常是成功的,除非遇到I/O 错误,因此,下面语句中$result 的值通常为1:
$result = print(“hello world\n”);
如果以其它方式来使用返回值呢?假如想把返回值乘以4:
print (2+3)*4; #oops!
当Perl 遇到上述代码时,将输出5。然后将print 的返回值1,乘以4。其结果被丢弃了,因为没有将其值赋给任何变量。
现在,有些人可能会说:“嘿,Perl 不能进行数学运算!应该输出20,而非5!”
这是由括号是可选的引起的;有时,人会忽略括号属于哪一部分。当没有括号时,print 是一个列表操作,将后面的所有元
素输出来,这通常是你所希望的。当print 后面是一个开括号时,print 为函数调用,它将输出括号中的内容。由于上述代码
中有括号,则它等同于下面的代码:
(print (2+3)) * 4; #oops!
幸运的是,如果打开了警告时(warnings),Perl 会提示你。因此至少在程序的开发和调试阶段,使用–w 或者use warnings,。
上述规则,对于Perl 中所有的列表函数都是有效的,不仅仅是print, 但print 可能是最容易引起人注意的。如果print(或者
别的函数)后面紧接着一个开括号,则要确保闭括号在所有的参数之后。
◆0 参数或者1 参数的函数不会遇到这种问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-23 16:15 , Processed in 0.019787 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表