Perl输入与输出

版权声明:转载请说明出处! 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] ;
  • 钻石操作符<>

  • 钻石操作符,可以指定程序的输入源,即用户可以指定输入的读入位置。

    • 如果我们脚本名称为 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看做一个大文件
  • 双钻石操作符<<>>

    • 双钻石操作符,用于修复钻石操作符的一个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

猜你喜欢

转载自blog.csdn.net/qq_39556143/article/details/84889020