第五章 输入与输出
1、 在While循环里,Perl会一次读取一行输入,把它存入某个变量并且执行循环主体后再去寻找下一行输入;而在foreach循环中,整行输入操作会在列表上下文执行,因此,循环开始前,它会把所有输入事先读进来,在对于处理大体积的文本文件是十分不利的;
2、 “< >”,即钻石操作符(有的书上称作菱形操作符,也有的书上称作尖括号操作符,我们这里姑且采用Randal的命名),用来从文件句柄读入数据;如果在< >中没有指定任何文件句柄时,Perl就从特殊数组变量@AVRG中读入文件列表,在@AVRG为空时就会改从标准输入流读取数据;@AVRG数组的用法跟其它数组相同;
3、 钻石操作符在读入数据时,其读取的是以“$/”中的内容为结束标志的一行内容,$/中默认存储的为“/n”,也可以将其声明为其它“分隔符”而非换行符,如 undef $/可以让<>一次读取到文件尾部而不是仅仅读取一行;
4、 print操作符会读取一个列表的所有值,并把每个项目(字符串)依次输出,它不会在每个项目之前、之间和之后添加任何额外的字符,如空格、换行符等;所以,print @array 会输出列表中的项目,而 print “@array” 会输出一个项目——字符串,而其间有空格(Perl在将数组替换到字符串时会在每个元素间加上空格);
5、 由于print所处理的是一串要输出的字符串,因此它的参数会在列表上下文中执行;print是个函数,其执行成功时返回值“真”,否则为“假”;
6、 printf函数可用于格式化输出,其格式为:printf “格式”, 数据列表 ;常用的格式转换定义符有:
a) %d :有正负号的十进制数;浮点数会被“取整”,而非四舍五入;
b) %e和%E:显示指数形式的浮点数;
c) %f:显示浮点数;
d) %g或%G:自动选择浮点数、指数甚至正数形式;
e) %s:显示字符串;
f) %%:显示百分号;
7、 printf允许设定显示字段宽度,如%10s,将宽度设为负值可指定为左对齐;
8、 在以数组作为printf的参数时,由于数组变量元素的个数是不定的,因此,应该先获得元素个数,而后再为每个元素对应设定一个“格式”;如“%s x @array”就指定了以数组array的个数作为%s连续指定的次数;
9、 文件句柄(filehandle)代表Perl进程(process)与外界之间的输入/输出联系(connection),它是个“联系”的名称;句柄的命名规则同其它标识符,建议全部大写,以示区别;文件句柄不一定总要指代磁盘上的文件;Perl有6个保留的文件句柄名称:STDIN、STDOUT、STDERR、DATA、ARGV、ARGVOUT;
10、 Perl所提供的3种文件句柄STDIN、STDOUT和STDERR,都是由产生Perl进程的父进程自动打开的文件或设备;当你需要其它文件句柄时,也需要事先打开文件句柄,这可以使用open函数实现;通常形式为:open (HANDLE,”filename”) or die (“Cannot open file:$!”);$!保留系统最后一次错误的信息;可以用标量变量替换文件名;
11、 可以在文件名前添加前缀以指定打开方式:
a) <filename 打开一个文件,以便读取内容;这个为默认行为;
b) > 打开一个文件,以便写入;原有的内容会被丢弃;
c) >> 打开一个文件,以便在文件尾部追加内容;
d) +< 打开一个文件,以便更新(读写);
e) +> 创建一个文件,以便更新;如果文件已存在会丢弃其原有内容;
f) +>> 追加;打开或创建一个文件以便更新;
12、 不良文件句柄为因权限或错误文件名等原因而未成功打开的文件句柄,如果程序尝试从不良文件句柄读数据会立刻读到文件尾部,如果尝试写入数据到不良文件句柄,数据会被无声无息的丢弃;
13、 “close 文件句柄名称”可以用来关闭一个文件句柄;重复打开时,Perl会关闭原先的文件句柄,程序结束时Perl也会自动关闭文件句柄;无论如何,建议为每一个成功的open进行close;
14、 die函数可以输出程序中指定的信息,并让程序在非零状态下立刻终止;Unix上,程序结束状态通常有“0”代表成功,“1”代表语法错误,“2”代表处理某程序时发生了错误;$!在指示用法错误时可以使用,而追踪调试过程中的错误时则不必要使用;
15、 warn函数可以用来产生警告信息,但不会终止程序运行;
16、 print和printf函数可以向以写入或追加模式打开的文件句柄中写入数据;句柄和列表内容之间不用逗号;如果不为其指定文件句柄名称,默认为STDOUT;可以使用select函数改变默认的文件句柄,格式为“select 文件句柄名称”,为避免错误,建议使用完后恢复默认;
17、 将数据输出到文件句柄时,默认都会进行缓冲,如果想立即输送到文件,可以通过将$|的值设定为“1”来实现,即在程序中添加“$|=1”(不用外面的引号);
18、 可以通过重新打开默认错误流文件句柄将错误信息定位输出至文件,如“open STDERR “>>/home/bentham/error_log” or die “Cannot open logfile for append:$!; ”,如果重新打开默认文件句柄失败,Perl会自动将句柄恢复至原来的文件句柄;