Perl教學 第11篇 文件系統(tǒng)之一
發(fā)表時間:2024-06-11 來源:明輝站整理相關軟件相關文章人氣:
[摘要]本章所講的函數(shù)多數(shù)使用了UNIX操作系統(tǒng)的特性,在非UNIX系統(tǒng)中,一些函數(shù)可能沒有定義或有不同的工作方式,使用時請查看Perl聯(lián)機文檔。一、文件輸入/輸出函數(shù)本節(jié)講述從文件中讀取信息和向文件寫入信息的內(nèi)置庫函數(shù)。1、基本I/O函數(shù)一些I/O函數(shù)在前面的章節(jié)中已有講述,如·open:允許...
本章所講的函數(shù)多數(shù)使用了UNIX操作系統(tǒng)的特性,在非UNIX系統(tǒng)中,一些函數(shù)可能沒有定義或有不同的工作方式,使用時請查看Perl聯(lián)機文檔。
一、文件輸入/輸出函數(shù)
本節(jié)講述從文件中讀取信息和向文件寫入信息的內(nèi)置庫函數(shù)。
1、基本I/O函數(shù)
一些I/O函數(shù)在前面的章節(jié)中已有講述,如
·open:允許程序訪問文件
·close:終止文件訪問
·print:文件寫入字符串
·write:向文件寫入格式化信息
·printf:格式化字符串并輸出到文件
這里簡單回顧一下,再講一些前面未提到的函數(shù)。
1)open函數(shù)
open函數(shù)將文件變量與某文件聯(lián)系起來,提供訪問文件的接口,例如:open(MYVAR, "/u/file"); 如果文件打開成功,則返回非零值,否則返回零。缺省地,open打開文件用以讀取其內(nèi)容,若想打開文件以寫入內(nèi)容,則在文件名前加個大于號:open(MYVAR, ">/u/file"); 向已有的文件末尾添加內(nèi)容用兩個大于號:open(MYVAR, ">>/u/file"); 若想打開文件作為數(shù)據(jù)導向的命令,則在命令前加上管道符( ):open(MAIL, " mail dave");
2)用open重定向輸入
可以把打開的文件句柄用作向程序輸入數(shù)據(jù)的命令,方法是在命令后加管道符( ),如:
open(CAT, "cat file* ");
對open的調(diào)用運行命令cat file* ,此命令創(chuàng)建一個臨時文件,這個文件的內(nèi)容是所有以file打頭的文件的內(nèi)容連接而成,此文件看作輸入文件,可用文件變量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命令列出當前時間、系統(tǒng)負載和登錄的用戶,以及每個用戶的作業(yè)時間和當前運行的命令,如:
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的調(diào)用指定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行把剩下的行賦給數(shù)組@users,然后第9行關閉WOUT,終止運行w命令的進程。
@users中的每個元素都是一行用戶信息,因為本程序只需要每行的第一個單詞,即用戶名,故10~12行去掉除換行符外的其它字符,這一循環(huán)結束后,@users中只剩下用戶名的列表。
第13行輸出存貯在$time中的時間,注意這時print不需要加上換行符,因為$time中有。16~21行對@users中的用戶名排序并輸出。因為同一個用戶可以多次登錄,所以用$preuser存貯輸出的最后一個用戶名,下次輸出數(shù)組元素$user時,如果其與$preser相等,則不輸出。
3)文件重定向
許多UNIX shell可以把標準輸出文件(STDOUT)和標準錯誤文件(STDERR)都重定向到同一個文件,例如在Bourne Shell(sh)中,命令
$ foo > file1 2>&1
運行命令foo并把輸出到標準輸出文件和標準錯誤文件的內(nèi)容存貯到文件file1中。下面是用Perl實現(xiàn)這一功能的例子:
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中的內(nèi)容為:
line 2
line 1