本章所講的函數(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ù)導(dǎo)向的命令,則在命令前加上管道符(|):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的輸出來列出當(dāng)前登錄的所有用戶名。
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: } 結(jié)果輸出如下:
Current time: 4:25pm Users logged on: dave kilroy root zarquon w命令列出當(dāng)前時間、系統(tǒng)負載和登錄的用戶,以及每個用戶的作業(yè)時間和當(dāng)前運行的命令,如:
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命令的輸出中取出所需的信息:當(dāng)前時間和登錄的用戶名。第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行刪去除時間和結(jié)尾換行符之間的所有字符,存入變量$time。 第7行從WOUT讀取第二行,這行中無有用信息,故不作處理。第8行把剩下的行賦給數(shù)組@users,然后第9行關(guān)閉WOUT,終止運行w命令的進程。 @users中的每個元素都是一行用戶信息,因為本程序只需要每行的第一個單詞,即用戶名,故10~12行去掉除換行符外的其它字符,這一循環(huán)結(jié)束后,@users中只剩下用戶名的列表。 第13行輸出存貯在$time中的時間,注意這時print不需要加上換行符,因為$time中有。16~21行對@users中的用戶名排序并輸出。因為同一個用戶可以多次登錄,所以用$preuser存貯輸出的最后一個用戶名,下次輸出數(shù)組元素$user時,如果其與$preser相等,則不輸出。 3)文件重定向 許多UNIX shell可以把標(biāo)準(zhǔn)輸出文件(STDOUT)和標(biāo)準(zhǔn)錯誤文件(STDERR)都重定向到同一個文件,例如在Bourne Shell(sh)中,命令 $ foo > file1 2>&1 運行命令foo并把輸出到標(biāo)準(zhǔn)輸出文件和標(biāo)準(zhǔn)錯誤文件的內(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
|