第五章:输入输出
while (defined($line = <STDIN>)) { print "I saw $line"; } while (<STDIN>) { print "I saw $_"; }
while (defined($line = <>)) { chomp($line); print "It was $line that I saw!\n"; } #用来从某个文件中读入数据流。
while (<>) { chomp; print "It was $_ that I saw!\n"; }
|
调用参数:
技术上来说,钻石操作符其实不会去检查调用参数,它的参数其实是来自@ARGV数组。这个数组是由Perl解释器事先建立的特殊数组,其内容就是由调用参数组成的列表。
@ARGV = qw# larry moe curly #; #强制让钻石操作符读取这三个文件
while (<>) { chomp; print "It was $_ that I saw in some stooge-like file!\n"; } 输出到标准输出: $name = "Larry Wall"; print "Hello there, $name, did you know that 3+4 is ", 3+4, "?\n";
print @array; #把数组的元素打印出来
print "@array"; #打印出一个字符串(数组元素内插的结果)
print <>; #和Unix下的'cat'命令功能差不多
print sort<>;
|
print后面可有可无括号:除非这样做会改变表达式的意义,否则Perl里的括号可以省略。所以有两种方法可以输出一样的东西:
print("Hello, world!\n");
print "Hello, world!\n";
假如print的调用看起来像函数调用,它就是一个函数调用。这个规则很简单,但是”看起来像函数调用“是什么意思呢?
在函数调用里,函数名后面必须紧接着一对括号,里面包含函数的参数,如下:
print (2+3); #输出为5
$result = print ("hello world!\n");
$result通常会是1;
printf格式化输出:
$user = "zengqinghua"; $days_to_die = 3; printf "Hello, %s; your password expires in %d days!\n", $user, $days_to_die;
|
%表示转换,每种转换都会以百分比符号(%)开头,然后以某个字母结尾。(在这两个符号之间可以存在额外的有效字符)。
而后面的列表里元素的个数应该和转换的数目一样多,如果数目不对,就无法正确运行。
printf可用的转换格式很多,可以在perlfunc在线手册里找到详细的说明。
%g 按需要自动选择浮点数、整数甚至是指数输出。
[root@cn-prs01 tmp]# cat a1 |tail -n 1
printf "%g %g %g\n", 5/2, 51/17, 51**17;
[root@cn-prs01 tmp]# perl a1
2.5 3 1.0683e+29
%d 格式代表十进制的整数,它会舍去小数点之后的数字:
printf "in %d days!\n", 17.85;
printf最常用在字段的数据输出上,因为大多数的转换格式都可以让你指定宽度。如果数据太长,字段会按需要自动扩展:
printf "%6d\n", 42; #输出结果看起来像 ~~~~~~42(~符号代表空格)
printf "%2d\n", 2e3 +1.95; #2001
%s 代表字符串格式,所以它的功能其实就是字符串内插,只是它还能设定字段宽度。
printf "%10s\n", "wilma"; #看起来像~~~~~wilma
如果宽度字段是负值,则会向左对齐(适用于上述各种转换):
printf "%-15s\n", "flintstone"; #看起来像flintstone~~~~~
%f 转换格式(浮点数)会按需要四舍五入,甚至还可以指定小点数之后的输出倍数:
printf "%12f\n", 6*7 + 2/3; #看起来像~~~42.666667
printf "%12.3\n", 6*7 + 2/3; #看起来像~~~~~~42.667
printf "%12.0\n", 6*7 + 2/3; #看起来像~~~~~~~~~~43
要输出真正的百分号,请使用%%,它的特殊之处在于,不会输出(参数)列表中的任何元素:
[root@cn-prs01 tmp]# cat a1 |tail -n 3
printf "Monthly interest rate: %.2f%%\n", 5.25/12; [root@cn-prs01 tmp]# perl a1
Monthly interest rate: 0.44%
|
数组和printf:
一般来说,你不会将数组当成printf的参数。这是因为数组可以包含任意数目的元素,而格式字符串却只会用到固定数目的元素:假如字符串里有三个转换格式,那就必须刚好有三个元素可供使用。
[root@cn-prs01 tmp]# cat a1 |tail -n 5
my @items = qw( wilma dino pebbles ); my $format = "The items are:\n" . ("%10s\n" x @items); ## print "the format is >>$format<<\n"; # for debugging
printf $format, @items;
[root@cn-prs01 tmp]# perl a1
The items are: wilma dino pebbles *************************************** my @items = qw( wilma dino pebbles ); printf "The items are:\n".("%10s\n" x @items), @items;
|
文件句柄:
文件句柄(filehandle)就是程序里代表Perl进程(process)与外界之间的I/O联系的名字。也就是”这种联系“的名称,不一定是文件名。
但是因为没有任何前置字符,所以当我们阅读它的时候,有可能会与现在或将来的保留字互相混淆,或是与标签(label)互相混淆,所以建议使用全大写字母来命名文件句柄。这样不仅看起来更加明显。也能避免将要引入的(小写)保留字冲突。
STDIN、STDOUT、STDERR、DATA、ARGV和ARGVOUT这六个文件句柄是Perl保留的。
不正确的文件句柄:
Perl和其它程序语言一样,它自身无法打开文件,只能要求操作系统帮它打开文件。当然操作系统可能会以权限不足、文件名错误拒绝打开。
关闭文件句柄:
用close操作符来关闭它;
close BEDROCK; my $success = open LOG, ">>logfile"; # capture the return value
if ( ! $success) { # The open failed
... }
|
用die处理严重错误:
第个在Unix上运行的程序都会有一个退出状态,用来告诉我们程序的运行是否成功。那些以调用其他程序为工作的程序(像make),会查看那些程序的结束状态来判断是否一切顺利。传统上,零代表成功,非零代表失败。
f ( ! open LOG, ">>logfile") { die "Cannot create logfile: $!"; } $!将放到错误提示中。
if (@ARGV < 2) { die "Not enough arguments\n"; }
|
当参数不足两个的时候,返回错误信息!
使用文件句柄:
if ( ! open PASSWD, "/etc/passwd") { die "How did you get logged in? ($!)"; } while (<PASSWD>) { chomp; ... }
如下: if ( ! open PASSWD, "/etc/passwd") { die "How did you get logged in? ($!)"; } else { ( open PASSWD, "/etc/passwd"); while (<PASSWD>){ print $_; } } 习题: =========================================================== #!/usr/bin/perl -w
print (reverse<>);
===========================================================
print "Enter some lines, then press Ctrl-D:\n"; # or Ctrl-Z
chomp(my @lines = <STDIN>); print "1234567890" x 7, "12345\n"; # ruler line to column 75
foreach (@lines) { printf "%20s\n", $_; }
===========================================================
print "What column width would you like? "; chomp(my $width = <STDIN>); print "Enter some lines, then press Ctrl-D:\n"; # or Ctrl-Z
chomp(my @lines = <STDIN>); print "1234567890" x (($width+9)/10), "\n"; # ruler line as needed
foreach (@lines) { printf "%${width}s\n", $_; }
|
阅读(878) | 评论(0) | 转发(0) |