Perl Learning (5) —— 输入与输出
(1) 讀取標準輸入
(2) 鉆石操作符輸入
(3) 調用參數
(4) 輸出到標準輸出
(5) 使用printf格式化輸出
(6) 數組和printf
(7) 文件句柄
(8) 打開和關閉文件句柄
(9) 用die處理嚴重錯誤
(10) 使用warn輸出警告信息
(11) 使用文件句柄
(12) 改變默認的文件輸出句柄
(13) 使用say來輸出
(1) 讀取標準輸入
“行輸入”<STDIN>操作符
【1】在標量上下文中
調用“行輸入”操作符,將會返回標準輸入中的一行。
$line = <STDIN>;??? # 讀取下一行
chomp($line);??? # 截掉最后的換行符
簡寫:
chomp($line = <STDIN>);# 習慣用法,效果同上
注意:如果讀到文件結尾(end-of-file),“行輸入”操作符就會返回undef —— 這樣的設計是為了配合循環使用,可以自然地跳出循環。
注意:
[1] 只有當while循環的條件表達式里只有“行輸入”操作符的前提下,這個簡寫才起作用。假如條件表達式里放了其他的東西,它就無法按你的預期運行了。
[2] “行輸入”操作符(<STDIN>)和Perl的“老地方”變量($_)之間并沒有什么關聯。只是在這個簡寫里,輸入的內容會恰好存儲在$_變量中而已。
【2】在列表上下文中
調用“行輸入”操作符,它會返回一個列表,其中包含(其余)所有的輸入內容,每個列表的元素代表一行輸入內容。
注意:while循環和foreach循環的區別
兩者不同之處在于它們背后的運作方式。
在while循環里,Perl會讀取一行輸入,把它存入某個變量并且執行循環的主體。接下來,它會回頭去尋找其他的輸入行。
在foreach循環里,“行輸入”操作符會在列表上下文中執行(因為foreach需要逐項處理列表的內容)。為此,在循環能夠開始執行之前,它必須先將輸入全部讀進來。
建議:最好的做法,對于大文件,通常是盡量使用while循環的簡寫,讓它每次處理一行。
(2) 鉆石操作符輸入
還有另一種讀取輸入的方法,就是使用鉆石操作符<>。
它能讓程序在處理調用參數的時候,提供類似于標準Unix工具程序的功能。
程序的調用參數(invocation arguments)通常是命令行上跟在程序名后面的幾個“單詞”。
注意:
[1] 連字符(-)當作參數,代表標準輸入。
[2] 讓程序以這種方式運行的好處,就是你可以在運行時指定程序的輸入源。
注意:
[1] 鉆石操作符是“行輸入”操作符的特例。不過它并不是從鍵盤取得輸入,而是從用戶指定的位置讀取。
[2] 鉆石操作符只有在碰到所有輸入的結尾時,才會返回undef。(然后就會跳出while循環)
[3] 由于鉆石操作符通常會處理所有的輸入,所以當它在程序里出現好幾次時,通常是錯誤的。
(3) 調用參數
鉆石操作符其實不會去檢查調用參數,它的參數其實是來自@ARGV數組。
注意:
[1] 這個數組是由Perl解釋器事先建立的特殊數組,其內容就是由調用參數組成的列表。在程序開始運行時,@ARGV里就已經塞滿了調用參數。
[2] 如果@ARGV是空列表,就會改用標準輸入流。
[3] 只要尚未使用鉆石操作符,你就可以對@ARGV動點手腳。
?
(4) 輸出到標準輸出
print操作符會讀取一個列表里的所有值,并把每一項依次送到標準輸出。
print @array;# 元素之間沒有空格
print "@array";# 數組所有元素之間用空格分開
注意:因為Perl把數組內插到字符串中時,會在每個元素之間加上空格。
由于print處理的是待打印的字符串列表,因此它的參數會在列表上下文中執行。而鉆石操作符(“行輸入”操作符的特殊形式)在列表上下文中會返回由許多輸入行組成的列表,所以它們彼此可以配合工作。
print <>;# 和Unix下的'cat'命令功能差不多
print sort <>;# 和Unix下的'sort'命令功能差不多
注:現在你可以用Perl重寫所有的Unix工具程序。
注意:print后面的括號可有可無 —— 除非這樣做會改變表達式的意義,否則Perl里的括號可以省略。
print (2+3)*4;# 輸出5
print ( (2+3)*4 )# 輸出20
(5) 使用printf格式化輸出
常用的轉換(conversion):
view plain注意:
[1] 對齊方向:負數(左對齊);正數(右對齊)。
[2] %%,不會輸出(參數)列表中的任何元素。
(6) 數組和printf
動態產生格式字符串。
注意:在標量上下文中,用了一次@items以取得它的長度,然后又在列表上下文中用了它一次以取得它的內容。(上下文的重要性)
(7) 文件句柄
建議:使用全大寫字母來命名文件句柄。
【六個特殊文件句柄】(Perl保留的)
STDIN、STDOUT、STDERR、DATA、ARGV和ARGVOUT。
(8) 打開和關閉文件句柄
Perl提供的三種文件句柄STDIN、STDOUT和STDERR,都是由產生Perl進程的父進程(可能是shell)自動打開的文件或設備。
當你需要其他的文件句柄時,請使用open操作符。
open CONFIG, "filename";
open CONFIG, "<filename";# 從文件中輸入
open BEDROCK, ">filename";#輸出到文件(“>”會重新創建文件)
open LOG, ">>logfile";#輸出到文件(“>>”追加的方式)
在Perl 5.6之后,open另有一種使用三個參數的寫法。
open CONFIG, "<", "filename";
不正確的文件句柄
open的返回值來判斷句柄是否正確:
my $success = open LOG, ">>logfile";# 捕獲返回值
if (! $success) {
??? # open操作失敗
??? # ...
}
關閉文件句柄
當你不再需要某個文件句柄時,可以用close操作符來關閉它。
close CONFIG;
建議:請為每個open搭配一個close。最好是在每個文件句柄用完之后就立刻關閉它,哪怕程序馬上就結束了。
注:
關閉文件句柄會:[1] 刷新輸出緩沖 [2] 釋放該文件上的任何鎖。
(9) 用die處理嚴重錯誤
當Perl遇到嚴重錯誤(fatal error)時,程序應該終止運行,并用錯誤信息告知原因。
die函數會輸出你指定的信息(到為這類信息預留的標準錯誤流中),并且讓你的程序立刻終止,并返回不為零的退出碼。
if (! open LOG, ">>logfile") {
??? die "Cannot create logfile: $!";
}
注意:
[1] $! 代表:可讀的系統出錯信息。當系統拒絕我們所請求的服務時,$! 會給我們一個理由。—— 即,解釋性的系統錯誤信息就保存在Perl的特殊變量$!中。
[2] 只有在系統服務請求失敗后的瞬間,$! 的值才會有用。如果操作成功了,就不會在$!里留下任何有用的信息。
[3] die還會自動將Perl程序名和行號附加在錯誤信息的后面。
(10) 使用warn輸出警告信息
warn函數和die函數的區別:不同之處在于最后一步,warn不會終止程序的運行。
(11) 使用文件句柄
當文件句柄以讀取模式打開后,可以從它讀取一行數據,就像從STDIN讀取標準輸入流一樣。
寫入或是添加模式打開的文件句柄可以在print或printf函數中使用。—— 使用時,請直接將它放在關鍵字之后、參數列表之前。
view plain?
(12) 改變默認的文件輸出句柄
默認情況下,假如不為print或是printf指定文件句柄,它的輸出就會送到STDOUT。
不過,你可以使用select操作符來改變默認的文件句柄。
?
建議:當你所指定的默認文件句柄使用完畢之后,最好把它設回原先的默認值STDOUT來。
注意:將特殊變量$| 設定為1,就會使當前的默認文件句柄在每次進行輸出操作后,立刻刷新緩沖區。
(13) 使用say來輸出
Perl 5.10從正在開發的Perl 6 中借來了say這個函數。
它的功能和print函數差不多,但是會在每行輸出的結尾自動加上換行符。
use 5.010;
say "Hello!";# 比print和/n省掉4次按鍵
等價于:
print "Hello/n";
轉載于:https://www.cnblogs.com/salious/archive/2011/10/27/2226104.html
總結
以上是生活随笔為你收集整理的Perl Learning (5) —— 输入与输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 下的 多线程http 下载器
- 下一篇: 【翻译】(5)Android.mk Fi