版权声明:转载请说明出处! https://blog.csdn.net/qq_39556143/article/details/84889020
Perl输入与输出(1)
1. 标准输入和标准输出
1.1 从标准输入读取
- 标准输入分类
- 行操作符<STDIN>
- 钻石操作符<>
- 双钻石操作符<<>>
#!/usr/bin/perl
#行输入操作符,每次只读取标准输入的一行
while (defined($line = <STDIN>)) { #读取标准输入 -> 存入变量$line -> 检查变量是否定义 -> 是否执行while循环主体
print "I saw $line."
}
#简写while循环
while (<STDIN>) { #和上例结果一致,不过每次读取标准输入行的数据存储在默认变量$_中
print "I saw $_."
}
#foreach循环
foreach (<STDIN>) { #和上例结果一致,不过每次读取标准输入行的数据存储在默认变量$_中
print "I saw $_."
}
-
foreach 和 while 循环的区别
- while中<STDIN>
- 标量上下文;
- 每次读取标准输入的一行,存储至默认标量$_;
- 读入行不为空,就执行while主体,否则退出循环;
- foreach中<STDIN>
- 列表上下文;
- 每次读取全部标准输入数据,存储至默认列表@_;
- 遍历读取文件的每一行,将每行的数据存储@_[i] ;
- while中<STDIN>
-
钻石操作符<>
-
钻石操作符,可以指定程序的输入源,即用户可以指定输入的读入位置。
- 如果我们脚本名称为 script.pl,当我们执行下句时:(a,b,c, - 都可以看做参数)
(1) ./script.pl
##读取标准输入
(2) ./script.pl a b c
##一次读取a,b,c三个文件内容,其中a的最后一行与b的最后一行紧密相联,即输入将a,b,c合成一个大文件
(3)/script.pl a - b
##按顺序读取a,标准输入,b的内容,将a,标准输入,b看做一个大文件
- 如果我们脚本名称为 script.pl,当我们执行下句时:(a,b,c, - 都可以看做参数)
-
双钻石操作符<<>>
- 双钻石操作符,用于修复钻石操作符的一个bug;对钻石操作,当文件名中有特殊字符,如 | ,管道符会引发管道操作,如果我们采用<<>>,他和钻石操作符的作用基本类似,只是不再启动外部程序,因此即使文件名为a|b,也不会出发管道操作,而是打开文件 a|b。
#!/usr/bin/perl
while (<>) {
chomp ; #默认 -> chomp $_;
print "I saw $_.\n";
}
#如果此时我们调用 ./script.pl a b c ,那么<>会依次读取a,b,c的内容
#如果<>无法打开摸个文件,并且读入内容的话,就会显示相关出错信息,如果不能读取a,会跳过a直接读取b
- 调用参数
- 我们通过命令 " ./script.pl a b c ''打开的文件会被送到钻石操作符<>中,但是这个过程中还有一个默认数组:@ARGV,以上命令读回来的文件名存放在数组@ARGV中,<>读取的是@ARGV中的元素。如果@ARGV是空列表,那么程序会读取标准输入的值。
#!/usr/bin/perl
@ARGV = qw/c d e/; #固定@ARGV数组的值
while (<>) {
chomp ; #默认 -> chomp $_;
print "I saw $_.\n";
}
#如果此时我们调用 ./script.pl a b c ,那么<>会依次读取c d e的内容
#如果<>无法打开摸个文件,并且读入内容的话,就会显示相关出错信息,如果不能读取c,会跳过c直接读取d
1.2 向标准输出输出
- print 操作符会读取它后面的参数列表中的所有元素,并且把每一项依次送到标准输出。在每项之前,之后和之间都不会加上额外的字符。
- 直接打印数组 & 数组内插的区别:
- 数组内插到字符串中时,会在每个元素之间加上空格。(实际上是特殊变量$"的内容,默认是空格)
#!/usr/bin/perl
@array = qw/fred barney betty/;
print @array;
#结果: fredbarneybetty
print "@array";
#结果: fred narney betty
- 一般情况下,程序的输出结果会先输出到缓冲区,直到数量达到一定程度才访问外部设备;
- print 处理的时待打印的字符串,因此他的参数会在列表上下文中被执行;
- 钻石操作符在列表上下文中,就会返回有许多输入行组成的列表,因此两者可以搭配使用。
- print 是一个函数,因此被打印的信息可以写在括号内部,但是如果去掉括号不影响输出意义,那么括号就可以省去;
- 如果print函数看起来像是函数调用,那么它就是一个函数调用;
#!/usr/bin/perl
print <>; #结果: 相当于Unix下的/bin/cat
print sort <>; #结果: 相当于Unix下的/bin/sort
print (2+3); #结果: 5
print (2+3)*4; #结果: 4
(print (2+3))*4; #结果: 4 (输出成功的返回值为1)
print ((2+3)*4); #结果: 20
- 用printf格式化输出
- printf操作符的参数包括 “格式字符串” 以及 “要输出的数据列表”:
- 格式字符串:就是用来填空的模板,表示希望的输出格式;
- 数据列表:希望输出的数据,表示具体的数据;
- 格式字符串可以包含许多转换,每种都会以%开头,然后以某个字母结尾;
- 格式转换符的数量应该和数据列表中数据个数相等;
- 常用格式字符串列表
格式转换符 | 说明 |
---|---|
%d | 十进制输出 |
%x | 十六进制输出 |
%o | 八进制输出 |
%s | 字符串格式输出 |
%f | 浮点数格式输出 |
- 指定输出宽度和占位符*
#!/usr/bin/perl
printf "%d\n",32;
printf "%5d\n",32;
printf "%2d\n",2e3+1.95;
printf "%10s\n","wilma"; #右对齐
printf "%-15s\n","wilma"; #左对齐
printf "%12f\n",6 * 7+2/3; #共12位,包括整数位,小数点,小数位
printf "%12.3f\n",6 * 7+2/3; #共12位,包括整数位,小数点,小数位,小小数位指定为3
printf "%12.0f\n",6 * 7+2/3; #共12位,包括整数位,小数点,小数位,小小数位指定为0,没有小数位
#为了表明打印格式以下用-表示一个空格,以上的输出结果为:
#Result:
32
---32
2001
-----wilma
wilma----------
---42.666667
------42.667
----------43
- 通过占位符‘ * ’指定打印字段宽度
#!/usr/bin/perl
print "%*s",10,"wilma"; #指定打印宽度
print "%*.*f",6,2,3.14159; #分别指定全部打印宽度,小数部分宽度
print "%*.*f",6,3,3.14159; #分别指定全部打印宽度,小数部分宽度
#为了表明打印格式以下用-表示一个空格,以上的输出结果为:
#Result:
-----wilma
---3.14
--3.142
- printf 操作符和数组
- 一般而言,不会把数组当做 printf 的参数,因为打印格式的格式转换符个数是固定的,数组的长度是不固定的;
- 如果格式转换符和打印数据的个数不同,打印将会出错;
- 字符串操作符“x”,表示字符串重复多少次,利用“x”可以实现数组和 printf 的配合
#!/usr/bin/perl
my @items = qw/wilma dino pebbles/;
my $format = "This items are: \n".("%10s\n" x @items);
## print "the format is >>$format<<\n"; 用于调试
print $format,@items;
##简便写法
print "This items are: \n".("%10s\n" x @items),@items;
#打印结果相同
#Result
This items are:
-----wilma
------dino
---pebbles