设为首页 收藏本站
查看: 734|回复: 0

[经验分享] Perl 学习笔记-输入输出

[复制链接]

尚未签到

发表于 2015-12-28 11:29:07 | 显示全部楼层 |阅读模式
  1.读取标准输入<STDIN>(行输入操作=> 读取一行直到换行符)



chomp($line = <STDIN>); # 读取一行并去掉最后的换行符(不会自动去掉)
print $line;
printf("\n"); # 格式化输出换行符
#在下面的循环里面会自动去掉末尾换行符,和上下文相关?不过最好还是写在循环体内的第一行,如果需要的话
while(defined($line=<STDIN>)){ # defined保证变量不为undef
print $line;
}
# 另一种写法,要注意的是<STDIN>能正常运行时因为有上下文,如果单独写到一行就不行,如果在列表上下文中,会得到不同的值
while(<STDIN>){   # 相当于 defined($_ = <STDIN>)
print $_;  
}
  2.在列表上下文中使用<STDIN>



# 与while循环不同的地方是必须等列表全部读入之后才会遍历,所以推荐用while
foreach (<STDIN>){
print $_;
}
  3.钻石操作符输入 <>
  让程序在处理调用参数的时候,提供类似于标准Unix工具程序的功能, 如cat, sort ,grep 等, 若想处理更复杂的参数格式,则不推荐.  在调用时给出文件名: 如 ./my_program fred battry - roger ; 其中 - 表示标准输入, 其他的为文件名, 省略文件名则默认标准输入.



while(defined($line = <>)){ # 默认从标准输入读取,与<STDIN>一样
chomp($line);
print $line;
}
while(<>){
...
}
  4.调用参数 @ARGV
  自身程序的名称在变量 $0中, 可以将数组@ARGV当做一般数组处理



@ARGV = qw (first.pl -);
while(<>){
chomp;
print $_;
printf("\n");
}
  5.输出到标准输出
  print操作符会读取一个列表里的所有值,并把每一项(字符串)一次写到标准输出,在它的每一项前后都不会再加上额外的字符. 在使用数组和使用数组内插,在打印效果上不同.



@roger = qw/Roger loger h/;
print @roger;  # Rogerlogerh
printf("\n");
print "@roger";  #Roger loger h
  钻石操作符在列表上下文中会返回由许多输入行组成的列表,所以可以配合print使用. print sort <>;
  print 有返回值,除非发生了I/O错误,否则总是返回真
  注意在改变式子含义的时候使用括号,如  print ((2+3)*4); 如果去掉最外面的括号就会输出5 ,因为它先把print(2+3)输出,在将print的返回值乘以4,但是没有输出.
  6.使用printf格式化输出
  和C中的printf差不多, 例如,当使用 %g控制符时,会自动选择恰当的数值形式



@myitems = qw(roger loger loger9567);
# x 在标量表达式中表示复制,@myitems表示列表元素数量
$myformat = "The items are:\n" . ("%10s\n" x @myitems);
printf $myformat,@myitems;
  7.文件句柄
  Perl程序与外界之间I/O联系的名称, 不一定是文件名.建议使用全大写字母命令文件句柄,保留的句柄名有: STDIN, STDOUT,STDERR,DATA,ARGV,ARGVOUT; 前3个由产生Perl进程的父进程自动打开,如果需要其他文件句柄是,需要使用open操作符打开.



# 和shell的重定向类似,注意文件名前的空格可以区分 > >> 造成的错误!
open CONFIG , 'dino';  # 等价于open CONFIG '< dino',用文件句柄CONFIG打开已存在的文件dino,不存在就会无输入
open CONFIG , "> dino"  # 将CONFIG打开文件dino,不存在就新建,已有信息会被覆盖
open LOG , ">> logfile" # 追加方式
open (HANDLE, "| output-pipe-command");  # 设置一个输出过滤器
open (HANDLE, "input-pipe-command |");
  8.处理文件打开错误,使用die和系统错误变量 ( $! )



$flag = open(LOG, ">> logfile");
if(!$flag){
die "Can't open file logfile!".$!; # 注意有个叹号!
}else {
print "success!";
}
close LOG
  如果使用die的时候在后面的字符串中加入的"\n" , 那么输出的时候就不会显示行号和程序的文件名(默认要显示)
  9.使用文件句柄



if(! open PASSWORD,"/etc/passwd"){
die "How did you get logged in?($!)";
}
# 输出:
# How did you get logged in?(No such file or directory) at E:\loger9567\perl\five.pl line 2.
  实际上行输入操作符由两部分组成,一对尖括号已经里面用来输入的文件句柄,  以写入或添加模式打开的文件可以在print或printf函数中使用,   使用时将它放在关键字之后, 参数列表之前.



open LOG, ">> logfile"; # 注意在LOG后面有逗号
print LOG "Captain's log, stardate 3.14";  # 这样可以将后面的字符串写入到文件中,注意在LOG后面没有逗号
$done = 20;
$total = 100;
printf STDERR "%d percent complete.\n",$done/$total * 100;
  可以使用select操作符来改变默认的文件句柄(STDIN,STDOUT,STDERR), 如使用  select LOG ,那么在输出的时候就不用再print后面加LOG了
  一旦使用了默认的文件句柄, 程序就会一直往那里输出, 所以为避免混淆,  使用过后最好还原, 将数据输出到文件是默认会进行缓冲处理, 所以要先将特殊变量( $| )设定为1   $| = 1;  之后再 select STDOUT 即可
  10. Perl中的println函数-- say
  但是需要每次使用时加上  use 5.010;



use 5.010;
say "HELLO";
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-157427-1-1.html 上篇帖子: perl启动后台进程 下篇帖子: eclipse安装perl插件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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