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 ((+)*); 如果去掉最外面的括号就会输出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 = ;
$total = ;
printf STDERR "%d percent complete.\n",$done/$total * ;

  可以使用select操作符来改变默认的文件句柄(STDIN,STDOUT,STDERR), 如使用  select LOG ,那么在输出的时候就不用再print后面加LOG了

  一旦使用了默认的文件句柄, 程序就会一直往那里输出, 所以为避免混淆,  使用过后最好还原, 将数据输出到文件是默认会进行缓冲处理, 所以要先将特殊变量( $| )设定为1   $| = ;  之后再 select STDOUT 即可

10. Perl中的println函数-- say

  但是需要每次使用时加上  use 5.010;

use 5.010;
say "HELLO";

Perl 学习笔记-输入输出的更多相关文章

  1. Perl 学习笔记-标量数据

    最近学习Perl, 准备看一遍入门指南,关键的东西还是记录下来,以便以后复习和查看参考. 笔记来自<<Perl语言入门第5版>> 1. 在Perl内部,不区分整数值和浮点数值, ...

  2. Perl 学习笔记-高级控制结构

    1.unless控制结构 类似于独立的else语句; 要么条件为真, 要么执行语句块内的代码;  unless(<condition>){code...;} 等价于  if(<con ...

  3. Perl 学习笔记-列表和数组

    笔记来自<<Perl语言入门第5版>> 1. Perl中列表指标量的有序集合,数组则是存储列表的变量, 这两个术语经常混用,不过更精确地说,列表指数据,而数组指变量.数组的表示 ...

  4. perl学习笔记

    一.正则表达式 匹配一个文件中的某个单词,并打印出来 #!/usr/bin/perl use strict; use warnings; ; open(FILE, "< temp.pl ...

  5. perl学习笔记(4)——动态加载

    在写perl的时候,如果要应用到各种平台的话,比如linux 和windows,会遇到各种问题,有时就是要根据系统类型来加载各种库,之前写的就是这样的, if($^O eq 'linux'){ use ...

  6. perl学习笔记(3)—— 坑

    (1)用perl来ls一个目录: 写perl的时候,经常要调用到系统命令,perl有很多等价的函数可以用,但是,不小心任性了,就想用system来实现了,好吧,来个ls把,列出指定的一个目录,直接上代 ...

  7. perl学习笔记(2)

    1)记得刚开始写perl的时候,对于一个功能,总是拿目前能用的数据类型来解决问题,不想想有没有更好的,能用能解决问题就好,这就导致了后期,要在函数里面添加功能的时候,函数要添加很多参数,一个函数有7. ...

  8. perl 学习笔记

    一:基础 1:安装perl      centos: yum -y install perl       官网:https://www.perl.org/      升级到5.22:先下载,执行./i ...

  9. 【Perl学习笔记】2. perl中的bless理解

    bless有两个参数:对象的引用.类的名称. 类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键. 所谓bless就是把 类型信息 赋予 实例变量. 程序包括5个文件:person.p ...

随机推荐

  1. EasyUI treegrid 删除一条或多条记录

    function del_dg() { $.messager.defaults = { ok: "是", cancel: "否" }; var node = $ ...

  2. json对象转换

    String modules =...; //json格式的String对象 //String对象转换为JSON格式数组 JSONArray moduleArr=JSONObject.parseArr ...

  3. Tomcat常用设置

    远程Dbug调试: TOMCAT配置(只需设置一次): 1.在服务器的$TOMCAT_HOME/bin/catalina.sh中增加: CATALINA_OPTS="-server -Xde ...

  4. 安装NFS服务,并挂载到开发板

    1.前言 由于嵌入式linux开发大多数使用的是交叉编译环境,难免很频繁的将文件在开发板和PC环境之间传递,最方便的当然是网络传递了,可以使用FTP,以及挂载NFS两种方式了,显然后者更为方便了. 2 ...

  5. [转]搭建MySQL高可用负载均衡集群

    转自:http://www.cnblogs.com/phpstudy2015-6/p/6706465.html 阅读目录 1.简介 2.基本环境 3.配置MySQL主主复制 4.中间件简述 4.1.H ...

  6. 线程之死锁、递归锁、信号量、事件Event 、定时器

    1.死锁的现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相 ...

  7. 原生JS模拟jQuery $

    模拟jQuery的$选择器 在获取元素的时候使用ID选择器,返回的是一个对象:使用类选择器或者标签选择器返回可能是一组元素:将获取到的一个或一组元素进行一个简易的封装封装成一个TQObject 什么是 ...

  8. Spring实战之切面编程

    如果要重用通用功能的话,最常见的面向对象技术是继承(inheritance)或委托(delegation).但是,如果在整个应用中都使用相同的基类,继承往往会导致一个脆弱的对象体系:而使用委托可能需要 ...

  9. C# 在根据窗体中的表格数据生成word文档时出错

    出错内容为:

  10. 在Ubuntu 16.04如何安装Java使用apt-get的

    转自:https://www.howtoing.com/how-to-install-java-with-apt-get-on-ubuntu-16-04/ 的Java和JVM(Java的虚拟机)是广泛 ...