加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl Learning 4 Input & Output

发布时间:2020-12-15 23:42:50 所属栏目:大数据 来源:网络整理
导读:【本文原创,未经允许不许转载】 读取标准输入流我们之前已经用过行输入操作符 STDIN 。在标量上下文中执行该操作时,将会返回标准输入中的下一行。如果读到文件结尾,行输入操作符就会返回 undef 。这样的设计是为了配合循环使用,可以自然跳出循环 结果:

【本文原创,未经允许不许转载】

读取标准输入流我们之前已经用过行输入操作符<STDIN>。在标量上下文中执行该操作时,将会返回标准输入中的下一行。如果读到文件结尾,行输入操作符就会返回undef。这样的设计是为了配合循环使用,可以自然跳出循环

结果:

可以简写为:

同时也有另外一种写法:

但是我们要注意的是:输入操作符放在其他任何地方(特别是自成一行的语句),它不会读取一行输入并自动存入默认变量$_,唯独while循环的条件表达式里只有行输入的操作符的前提下,这个简写才起作用。

两者的不同之处在于它们背后的运作方式。在while循环里,Perl会读取一行输入,把它存入某个变量并且执行循环的主体,接下来它会回头去寻找其他的输入行。但是在foreach循环中,行输入操作符会在列表上下文中执行(因为foreach需要逐项处理列表内容)。为此,在循环能够开始执行前,它必须先将输入全部读进来。

还有另外一种读取输入的方法,就是使用钻石操作符<?>,程序的调用参数(invocation?argument)通常是命令行上跟在程序后面的几个“单词”。

上面这条命令的意思是:执行my_program命令(位于当前目录),然后它应该会处理文件fred,接着是文件barney,最后是文件betty

钻石操作符是行输入操作符的特例。不过它并不是从键盘取得输入,而是从用户指定的位置读取。

结果:

在该目录下新建一个只有hello?world字符的hehe.txt,输入?perl?./hsl.pl?hehe.txt?得到:


同时输入多个文件,在切换的时候没有间断,因为使用钻石操作符时就好像这些文件已经合并成了一个很大的文件一样。


相当于遍历了两个文件,按每行输出。

我们还可以将程序继续简化:


将输入读取到默认的$_里。

?

从技术上来看,钻石操作符其实不会去检查命令行参数,它的参数其实不过是来自@ARGV数组。这个数组是由Perl解释器事先建立的特殊数组,其内容就是命令行参数组成的列表。



@ARGV强制让钻石操作符只读取hehe.txt?和hehe1.txt

一般情况下,程序的输出结果会先被送到缓冲区。也就是说,不会每当有一点点输出就直接送出去,而是会先积攒起来,直到数量够多时才造访外部设备。Print和其他函数一样返回某个值,不是真就是假,代表print是否成功执行。




Printf操作符的参数包括“格式字符串”及“要输出的数据列表”。格式字符串好像用来填空的模板,代表你想要的输出格式:


格式字符串里可以有多个所谓的转换(conversion)。每种转换都会以百分比符号(%)开头,然后以每个字母结尾。而后面的列表里元素的个数应该和转换的数目一样多。

要输出恰当的数字形式,可以用%g。它会按需要自动选择浮点数、整数甚至是指数形式。

%d格式则代表十进制整数,它会舍去小数点之后的数字。%s代表只字符串格式,所以它的功能是字符串内插,还能设定字段宽度。宽度为负数的话,则会向左看齐。

%f转换格式(浮点数),会按需要四舍五入,甚至还可以指定小数点之后的输出位数。


结果:

结果:

这段程序用了x操作符复制指定的字符串,复制的次数与@items的元素个数相同。

?

$?cat?fred?barney?|?sort?|??./your_program?|?grep?something?|?lpr。这条命令的意思是由cat命令将文件fred的每一行输出,再加上文件barney里的每一行。之后,将以上输出作为sort命令的输入。对所有的行进行排序,继而把排序结果交给your_program处理。Your_program完成相应的操作之后,再将输出数据送到grep,由它过滤掉数据中的某些行,并将剩下的数据输出到lpr这个命令,让它负责把最终结果传送给打印机打印出来。

除了标准输入和标准输出,还有另一个标准I/O流。如果再上一个例子中your_program发出任何警告或是其他诊断信息,这些信息就不应该继续在管道中往下传递。我们已经用grep命令来筛除特定字符串以外的任何数据,因此它可能会丢弃警告信息。而且即使它留下了警告信息,我们可能也不想让它传递到管道中下游的其他程序。


习题:


第一题:


第二题:



第三题:

这一章节里面的文件句柄我并没有去实现,课后也没有相关的习题。Open?CONFIG之类的。但以后编程的时候很有可能会用到,用的时候再翻过来看。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读