Perl输入与输出

键盘输入操作符<>

Larry从一堆冷僻符号中找到一对尖括号<>,用来作为标准输入的简写。

while(<STDIN>){
    print "I saw $_";
}

如果在列表上下文中使用<>,则返回一个列表,其中包括所有的输入内容,每一行作为一个元素。

foreach(<STDIN>){
    print "I saw $_";
    }

虽然上述两种做法的结果是一样的,但是过程不一样,while每次读取一行,而foreach则是在循环开始之前将全部内容加载进来,当文件非常大时,采用while更合适。

来自钻石操作符的输入

钻石操作符是行输入操作符的特例,不过它并不是从键盘取得输入,而是从用户指定的位置读取。

while(<>){
    chomp;
    print "I saw $_";
}

while(defined($line = <>)){
    chomp $line;
    print "I saw $line";
}

例如我们可以用fred.txt,barney.txt来调用这个程序,<>会一行一行的读取文件内容,并且当第一个文件读完的时候自动切换到第二个文件,类似于cat。如果不提供任何调用参数,程序会从标准输入流采集数据。钻石操作符读取到的内容可以在$_中找到。

调用参数

从技术上讲,<>操作符其实不会去检查命令行参数,它的参数实际上来自于数组@ARGV,只不过perl会自动用命令行参数来填充这个列表,因此,如果只要在使用<>之前,你动手修改@ARGV,就可以处理指定的文件,而不管用户在命令行里输入了什么参数。

print

print处理的是待打印的字符串列表,因此它的参数会在列表上下文中被执行。

print "hello",5,".\n";
print @array;       直接打印数组元素,元素之间没有空格。
print "@array";     数组内插,打印数组元素,元素之间用空格隔开。

print函数只返回真和假两个值,除非发生I/O错误,否则会一直返回1.

printf

print "hello , %s; your number is : %d\n",$user,$number;

格式字符串里可以有多个所谓的转换,以%开头,后面接的列表里的元素个数应该和转换的数目一样多。

print "in %6d days!\n",17.5;   =>''''17     
print "in %6.2d days!\n",17.555;   =>'17.55     
  • %6d 无条件截断,输出十进制整数,如果数据太长,数据需要自动扩展。
  • %12.5f 指定输入到小数点后第5位。一共占12位,包括小数点位。

文件句柄

文件句柄是程序里代表Perl进程与外界之间的I/O联系的名称。也就是说,它是这种联系的名称,而不是文件的名称。可以用裸字或者变量来表示文件句柄。一般编写短小的程序时多用裸字。在编写大一点的项目时,采用标量变量,这样可以更精确的控制文件句柄的作用域,方便调试和维护。

  • STDIN 标准输入流,通常是用户的键盘输入,除非用户要求别的输入来源。
  • STDOUT 标准输出流,默认情况下会输出到屏幕,但用户也可以把它输送到文件或者另一个程序。
  • STDERR 标准错误流。类似于STDOUT,只不过输出的是错误信息。
open LOG,`>`,$file_name;清空原内容,输出;裸字
open $file_handler,`>>`,$file_name;追加输出
open $file_handler,`<`,$file_name;输入
open $file_handler,`<:encoding(UTF-8)`,$file_name;输入,指定编码方式
my $success = open LOG ,'>>','logfile';

open的返回值能告诉我们执行结果成功与否。

关闭文件句柄

close BEDROCK;

请为每一个open搭配一个close,告诉Perl,让它通知系统,我们对数据流的处理已经全部完成。

die & warn

用来调试程序,指出错误信息。

if(!open LOG,'>>','logfile'){
    die "can not create logfile:$!\n";
    }

使用文件句柄

一旦文件句柄以读取模式打开之后,便可以从它读取一行行数据,就像从STDIN读取标准输入流中的数据一样。

open PASSWD,"/etc/passwd";
wihle(<PASSWD>){
    chomp;
...
}

以写入或者追加模式打开的文件句柄可以在print,printf函数中使用。

print LOG "this is logs";
print STDOUT;   默认打印$_

注意,这里不需要逗号将文件句柄和输出内容隔开,因为perl能自动识别第一个参数是一个文件句柄,因为它是一个裸字,而不是待输出的字符串。 如果你不为print指定文件句柄,它的输出就会送到STDOUT,不过你可以使用select操作符来改变默认的文件句柄。

select BEDROCK;
print "hello!\n";

当输出完毕之后,要使用select STDOUT 切换回标准输出,以免混淆。

if(!open STDERR, '>>','/home/barney/.err_log'){
    die "$!\n";
    }

Comments !