Chinaunix首页 | 论坛 | 博客
  • 博客访问: 547244
  • 博文数量: 201
  • 博客积分: 7734
  • 博客等级: 少将
  • 技术积分: 1994
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 19:18
文章分类

全部博文(201)

文章存档

2011年(28)

2010年(173)

分类:

2010-08-26 13:24:33

第五章:输入输出
 

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", $_;
}


阅读(838) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~