当前位置:早雪网网络学院编程文档Perl → perl5中文教程--第十一章perl文件系统

perl5中文教程--第十一章perl文件系统

减小字体 增大字体 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-23 10:55:49

第十一章  文件系统

by flamephoenix

 

一、文件输入/输出函数
  1、基本I/O函数
    1)open函数
    2)用open重定向输入
    3)文件重定向
    4)指定读写权限
    5)close函数
    6)print, printf和write函数
    7)select函数
    8)eof函数
    9)间接文件变量
  2、跳过和重读数据
  3、系读写函数
  4、用getc读取字符
  5、用binmode读取二进制文件
二、目录处理函数
  1、mkdir
  2、chdir
  3、opendir
  4、closedir
  5、readdir
  6、telldir
  7、seekdir
  8、rewinddir
  9、rmdir
三、文件属性函数
  1、文件重定位函数
  2、链接和符号链接函数
  3、文件许可权函数
  4、其他属性函数
四、使用DBM文件

    本章所讲的函数多数使用了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 = <WOUT>;
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
    可以看到,这两行并未按我们想象的顺序存贮,为什么呢?我们来分析一下这段程序。
    第3行重定向标准输出文件,方法是打开文件file1将它与文件变量STDOUT关联,这也关闭了标准输出文件。第4行重定向标准错误文件,参数>&STDOUT告诉Perl解释器使用已打开并与STDOUT关联的文件,即文件变量STDERR指向与STDOUT相同的文件。第5、6行分别向STDOUT和STDERR写入数据,因为这两个文件变量指向同一个文件,故两行字符串均写到文件file1中,但顺序却是错误的,怎么回事呢?
    问题在于UNIX对输出的处理上。当使用print(或其它函数)写入STDOUT等文件时,UNIX操作系统真正所做的是把数据拷贝到一片特殊的内存即缓冲区中,接下来的输出操作继续写入缓冲区直到写满,当缓冲区满了,就把全部数据实际输出。象这样先写入缓冲区再把整个缓冲区的内容输出比每次都实际输出所花费的时间要少得多,因为一般来说,I/O比内存操作慢得多。
    程序结束时,任何非空的缓冲区都被输出,然而,系统为STDOUT和STDERR分别维护一片缓冲区,并且先输出STDERR的内容,因此存贮在

[1] [2] [3] [4]  下一页


Tags:perl,中文,教程,第十,一章,perl,文件,系统
[数据载入中...] [返回上一页] [打 印]