Perl读取标准输入<STDIN>、读取文件输入<>和chomp函数
文章推薦指數: 80 %
例如,test.plx文件内容 ... 首页 新闻 博问 专区 闪存 班级 我的博客 我的园子 账号设置 简洁模式... 退出登录 注册 登录 骏马金龙 (博客已搬家:www.junmajinlong.com) 网名骏马金龙,钟情于IT世界里的各种原理和实现机制,强迫症重症患者。
爱研究、爱翻译、爱分享。
特借此一亩三分田记录自己成长点滴!!! 骏马金龙 网名骏马金龙,钟情于IT世界里的各种原理和实现机制,强迫症重症患者。
爱研究、爱翻译、爱分享。
特借此一亩三分田记录自己成长点滴!!! Perl读取标准输入
例如,test.plx文件内容: #!/usr/bin/perl # $line=
下面的命令,将等待输入和回车。
如果直接回车,则if条件为真。
perltest.plx 下面是和bashshell交互。
echo"hello"|perltest.plx echo-e"haha\nheihei"|perltest.plx 注意上面第二条语句中,heihei会被忽略,因为上面的操作是标量上下文(上下文的概念,以后会解释),在发现换行符的时候,结束输入的读取,所以看到haha后面的"\n"就结束了。
因为
例如,读取a.txt文件的内容到
第二种写法每次读取一行,每读取一行做下读取的位置标记方便下次读取(也就是说
由于
换句话说,上面的
(本段涉及到上下文和数组的概念,暂时还没介绍,如不理解,可先略过)上面的while和foreach有巨大的差别,while后面是标量上下文,foreach后面是列表上下文。
这意味着while是每次从文件中读取一行,打上位置标记以便下次读取,然后进入循环体。
而foreach因为操作目标是列表,它会一次性将文件中所有行读取到内存,然后当作列表进行遍历,所以性能非常差,例如400M的文件,也许需要1G的内存,因为perl会预估先分配足够多的内存以便后续不再因为分配内存的事而中断进程。
上面的过程,使用下面的形式描述,就很容易理解了: $line=
读取文件输入<> perl中使用两个尖括号符号表示读取来自文件的输入,例如从命令行中传递文件作为输入源。
这个符号被称为"钻石操作符"。
例如,test.plx程序内容如下: #!/usr/bin/perl while(defined($line=<>)){ print$_; } 或者简写的: #!/usr/bin/perl while(<>){ print$_; } 然后在perl程序的命令行中指定输入文件: $./test.plxtest.log 或者使用@ARGV数组指定输入文件: #!/usr/bin/perl @ARGV=qw(test.log); 如果想要读取标准输入的数据,则在命令行中使用短横线-。
$echo-e"haha\nheihei"|./test.plx- 一般来说,while循环中使用
关于<>的机制,请继续阅读下文的<<>>。
chomp()函数 这个函数用于去掉字符串或者读取到的标准输入的一个换行符。
注意关键字:字符串、一个、换行符。
注意,这个函数是在原处修改字符串。
但这个函数有自己的返回值: 如果能去掉换行符,则返回移除的字符数,也就是数值1。
这是个没什么用的返回值,因为我们都已经知道了; 如果没有换行符,则返回数值0; 如果结尾有两个换行符,则只去掉一个。
比较下面两个程序,它们会从标准输入中读取: $line=
chomp($line=
下面返回的是数值1。
printchomp($line="helloworld!\n"); <<>> 实际上,除了<>还有<<>>。
它们之间有区别,目前为止还没有介绍文件句柄和ARGV变量,所以能看懂则看,看不懂则过。
<>会隐式打开来自@ARGV数组中的参数文件,打开方式是两参数格式的open,类似于open"FH","$ARGV[N]"。
正常情况下这没什么问题,但可能会成致命的危险。
例如Perl脚本文件a.pl内容如下: #!/usr/bin/perl while(<>){print} 如果执行该脚本的方式为: $perla.pl"rm-rfv*|" 其中rm-rfv*|被当作一个参数收集到@ARGV数组中,因为<>以两参数模式的方式隐式打开文件,这等价于: openFH,"rm-rfv*|"; 这表示先打开一个管道,再执行rm-rfv*命令,并将该命令的输出通过管道传递供<>读取。
再看下面的示例,它们是等价的。
$perla.pl"ls/tmp|" $ls/tmp|perla.pl 这在写一行式perl程序的时候比较方便: perl-pe''"ls/tmp|" ls/tmp|perl-pe'' 所以,以<>的方式打开@ARGV中的文件时,因为无法保证这个数组中的参数一定是文件,所以可能会出现危险操作。
而<<>>则能避免这个问题,它隐式地以三参数的open打开@ARGV中的文件。
类似于: openFH,">){print}'/etc/passwd perl-e'while(<<>>){print}'"ls/tmp|"#报错 这时想要从管道读取数据,只能将管道放在perl命令的前面。
ls/tmp|perl-e'while(<<>>){print}' 作者:骏马金龙 出处:http://www.cnblogs.com/f-ck-need-u/ Linux运维交流群:921383787 Linux系列文章:https://www.junmajinlong.com/linux/index/ Shell系列文章:https://www.junmajinlong.com/shell/index/ 网站架构系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html MySQL/MariaDB系列文章:https://www.cnblogs.com/f-ck-need-u/p/7586194.html Perl系列:https://www.junmajinlong.com/perl/index Go系列:https://www.cnblogs.com/f-ck-need-u/p/9832538.html Python系列:https://www.cnblogs.com/f-ck-need-u/p/9832640.html Ruby系列:https://www.junmajinlong.com/ruby/index 操作系统系列:https://www.junmajinlong.com/os/index/ 精通awk系列:https://www.junmajinlong.com/shell/awk/index posted@ 2018-08-2115:58 骏马金龙 阅读(4779) 评论(0) 编辑 收藏 举报 刷新评论刷新页面返回顶部 Copyright©2022骏马金龙 Poweredby.NET6onKubernetes 😀点这里关注我😀 QQ群921383787 缩/放目录
延伸文章資訊
- 1即時餵資料給程式吃 - 朝陽科技大學
Perl 會把使用者敲在命令列上的參數放在@ARGV 陣列裡。 ... (如圖右半部, 想像資料從方框的左邊進來) 程式語法是while (<STDIN>) { ... } 如此perl 會每次...
- 2Prompt, read from STDIN, read from the keyboard in Perl
Prompt, read from STDIN, read from the keyboard in Perl ... use strict;; use warnings;; print "Yo...
- 3Programmatically read from STDIN or input file in Perl
while (<>) { print; }. will read either from a file specified on the command line or from stdin i...
- 4Perl的基本語法
chomp($input=<STDIN>);. (c) Output: print "variables or 字串";. Perl也有printf()函數,語法和C語言一模一樣 ...
- 5Perl | Use of STDIN for Input - GeeksforGeeks
Input to a Perl program can be given by keyboard with the use of <STDIN>. Here, STDIN stands for ...