本章所讲的函数多数使用了UNIX操作系统的特性,在非UNIX系统中,一些函数可能没有定义或有不同的工作方式,使用时请查看Perl联机文档。 一、文件输入/输出函数 本节讲述从文件中读取信息和向文件写入信息的内置库函数。 1、基本I/O函数 一些I/O函数在前面的章节中已有讲述,如
·open:允许程序访问文件 ·close:终止文件访问 ·print:文件写入字符串 ·write:向文件写入格式化信息 ·printf:格式化字符串并输出到文件 这里简单回顾一下,再讲一些前面未提到的函数。 1)open函数 open函数将文件变量与某文件联系起来,提供访问文件的接口,例如:open(MYVAR, "/u/file"); 如果文件打开成功,则返回非零值,否则返回零。缺省地,open打开文件用以读取其内容,若想打开文件以写入内容,则在文件名前加个大于号:open(MYVAR, ">/u/file"); 向已有的文件末尾添加内容用两个大于号:open(MYVAR, ">>/u/file"); 若想打开文件作为数据导向的命令,则在命令前加上管道符(|):open(MAIL, "|mail dave"); 2)用open重定向输入 可以把打开的文件句柄用作向程序输入数据的命令,方法是在命令后加管道符(|),如: open(CAT, "cat file*|"); 对open的调用运行命令cat file* ,此命令创建一个临时文件,这个文件的内容是所有以file打头的文件的内容连接而成,此文件看作输入文件,可用文件变量CAT访问,如: $input = ; 下面的例子使用命令w的输出来列出当前登录的所有用户名。
1 : #!/usr/local/bin/perl 2 : 3 : open (WOUT, "w|"); 4 : $time = ; 5 : $time =~ s/^ *//; 6 : $time =~ s/ .*//; 7 : ; # skip headings line 8 : @users = ; 9 : close (WOUT); 10: foreach $user (@users) { 11: $user =~ s/ .*//; 12: } 13: print ("Current time: $time"); 14: print ("Users logged on:\n"); 15: $prevuser = ""; 16: foreach $user (sort @users) { 17: if ($user ne $prevuser) { 18: print ("\t$user"); 19: $prevuser = $user; 20: } 21: } 结果输出如下:
Current time: 4:25pm Users logged on: dave kilroy root zarquon w命令列出当前时间、系统负载和登录的用户,以及每个用户的作业时间和当前运行的命令,如:
4:25pm up 1 day, 6:37, 6 users, load average: 0.79, 0.36, 0.28 User tty login@ idle JCPU PCPU what dave ttyp0 2:26pm 27 3 w kilroy ttyp1 9:01am 2:27 1:04 11 -csh kilroy ttyp2 9:02am 43 1:46 27 rn root ttyp3 4:22pm 2 -csh zarquon ttyp4 1:26pm 4 43 16 cc myprog.c kilroy ttyp5 9:03am 2:14 48 /usr/games/hack
上例中从w命令的输出中取出所需的信息:当前时间和登录的用户名。第3行运行w命令,此处对open的调用指定w的输出用作程序的输入,用文件变量WOUT来访问该输入。第4行读取第一行信息,即: 4:25pm up 1 day, 6:37, 6 users, load average: 0.79, 0.36, 0.28 接下来的两行从这行中抽取出时间。首先,第5行删除起始的空格,然后第6行删去除时间和结尾换行符之间的所有字符,存入变量$time。 第7行从WOUT读取第二行,这行中无有用信息,故不作处理。第8行把剩下的行赋给数组@users,然后第9行关闭WOUT,终止运行w命令的进程。 @users中的每个元素都是一行用户信息,因为本程序只需要每行的第一个单词,即用户名,故10~12行去掉除换行符外的其它字符,这一循环结束后,@users中只剩下用户名的列表。 第13行输出存贮在$time中的时间,注意这时print不需要加上换行符,因为$time中有。16~21行对@users中的用户名排序并输出。因为同一个用户可以多次登录,所以用$preuser存贮输出的最后一个用户名,下次输出数组元素$user时,如果其与$preser相等,则不输出。 3)文件重定向 许多UNIX shell可以把标准输出文件(STDOUT)和标准错误文件(STDERR)都重定向到同一个文件,例如在Bourne Shell(sh)中,命令 $ foo > file1 2>&1 运行命令foo并把输出到标准输出文件和标准错误文件的内容存贮到文件file1中。下面是用Perl实现这一功能的例子:
1: #!/usr/local/bin/perl 2: 3: open (STDOUT, ">file1") || die ("open STDOUT failed"); 4: open (STDERR, ">&STDOUT") || die ("open STDERR failed"); 5: print STDOUT ("line 1\n"); 6: print STDERR ("line 2\n"); 7: close (STDOUT); 8: close (STDERR); 运行后,文件file1中的内容为: line 2 line 1
|