perl 主要是對文件進行處理,所以免不了需要輸入與輸出。
1.輸入
a) 標準輸入。 標準輸入就是來自鍵盤的輸入了,可以這麼用 chomp($line = <STDIN>) 其中,<>接受出入,STDIN表示標準輸入,讀入標量$line, chomp操作符用來去除輸入行末尾的換行符(\n)。也可以這樣使用:while (<STDIN>) {
chomp; #默認對$_進行處理,等於上一例中的$line
}
b) 從文件輸入。 鑽石操作符<>,可以接受命令行的文件名,對文件進行按行輸入,讀取參數來自@ARGV數組,如程序program內容有
while (<>) {
chomp;
...
}
則可以在命令行這樣輸入$ ./program hello world程序會把hello 與 world 文件放入@ARGV數組,然後從數組中依次讀取文件,進行處理。如果數組爲空,也就是沒有參數(即要處理的文件),就會改用標準輸入流。
2.輸出
a)標準輸出。 有輸入自然要有輸出,標準輸出就是輸出內容到屏幕上。一般使用print 即可。如print "@arr"與print @arr,所不同的是前者會依次打印數組元素,有空格連接,後者沒用空格。 如果想像C語言一樣有格式化輸出,可以使用printf,如printf "I'm %s\n",$name; 模式爲‘格式字符串’加上‘要輸出的列表’。轉換的格式常用的有:%g 自動選擇數值形式;%d 十進制整數,%x 十六進制,%o 八進制;%s 字符串;%10.3f 浮點數,四捨五入,表示向右對齊共十位,保留小數點後3位;%-4d,表示向左對齊,共四位。注意要輸出%需要用%%。
有一個很不錯的輸出數組的方式printf "The items are:\n".("%10s\n" x @arr), @arr;其中@arr在這裏返回數組的元素個數,x表示重複這麼多次,即可格式化輸出數組全部元素。
b)輸出到文件。 需要先打開文件句柄。
3.文件句柄
在shell中輸入命令 $ ./program <file_input> file_output 即表示程序從file_input讀取輸入,輸出到file_output。
a)打開文件句柄。 open HD, "< file_input", open OUT," >file_output", open OUT, ">> file_output",分別表示打開文件句柄輸入,輸出(要麼新建文件,要麼清空原文件),以添加方式輸出。在新版本中當然可以將 '>' '<'分出來寫,更加安全。
b)關閉文件句柄。 close HD,close OUT。
c)出錯處理。 不是每次打開文件都會成功,這時候可以使用die函數處理,如下:
open HD,"< file_input" or die $!;
如果打開失敗會使程序終止運行,並輸出$!中內容,包含了失敗的原因。 也可以使用warn函數,與die類似,但是不會終止程序運行。
d)使用文件句柄。 瞭解了上面三點,就可以使用文件句柄工作了。
open HD, "< file_input" or die $!; #打開HD,輸入file_input內容
open OUT, ">> file_output" or die $!; #打開OUT,以追加方式打開file_output
while (<HD>) { #每次讀取輸入內容的一行
chomp;
my $line .= $_;#將每一行內容連接起來,放入$line
do_something;
}
print OUT "$line\n"; #最後通過句柄OUT將結果輸出到file_output。注意OUT與後面內容之間沒有逗號。
close HD,OUT;
也可以用say函數來代替print輸出,不同之處是末尾默認帶上換行符\n,很適合懶人啊。
有時候會需要將文件一次性讀入,然後進行處理。有一個小技巧可以實現。
open FH,"< file_input" or die $!;
local $/ = undef;
my $lines = <FH>;
close FH;
$/ 存儲的是每行文件的結束標誌,默認爲“\n”,改爲undef之後,相當於每一行都沒有結尾,自然可以一次性讀入了,然後就可以用$lines進行自由的文本處理了,使用local表示這個改變只適用於本處,不過如果是同一文件,下面接着要進行按行讀入,可以這樣改回來local $/ = "\n"。這樣就可以了。
掌握了這些,相當於掌握了文本處理的框架,接下來就可以進一步的學習perl了。