键盘输入操作符<>
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 "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 !