2012年1月29日 星期日

[Perl 文章收集] 實例說明 Perl 特殊變數

轉載自 這裡 
特殊變數 $_ 與 $$ : 
先來一個例子吧 : 
  1. #!/usr/bin/perl  
  2. use warnings;  
  3. @array = qw(a b c d);  
  4. foreach (@array) {  
  5.     print $_, " ";  
  6. }  
例子的作用就是定義一個數組並把其中的元素打印出來,這裡需要注意的是 foreach 循環部分,foreach 循環的標準格式應該是 : 
foreach $element (@array){
# Loop code
}

其中數組 @array 將其中的元素依次賦值給 $element,但是在上面那個程序中,我並沒有這樣做,在程序中,我就使用到了perl中內置的一個特殊變數 $_
在程序第五行中 : foreach (@array) 實際上就是等於 foreach $_ (@array). 在這裡,$_是預設是輸入/輸出,因此,如果在程序中有類似的沒有明確聲明的變數位置的時候,就有可能能使用 $_ 代替. 再看另外一個內置變數, 請在命令列下執行下面命令 : 
>perl -e "sleep(5); print qq(The PID of process perl.exe is: $$)"
The PID of process perl.exe is: 5260

$$ 是當前perl解析器的進程ID(即PID),大家可以將在段程序寫在命令行上,該程序會在 perl 解析器運行5秒後打印出 perl 解析器的進程 PID,大家可以在程序運行期間通過查看進程列表來確定打印結果是否正確. 

特殊變數 $! : 
接下來是一個用來返回錯誤信息(或是錯誤號)的特殊變數. 請參考命令如下 : 
>perl -e "opendir FH,'C:\none' or die qq(can't open:$!);"
can't open:No such file or directory at -e line 1.

這個命令就是要打開 C 盤 下的一個 none目錄(而實際上我的C盤中並沒有此目錄,之所以這樣寫的目的就是為了引起一個程序中的錯誤信息),如果沒有打開的話,會執行後面的 die qq(can’t open:$!) 在這裡,$! 就指明前次執行錯誤信息的內容

特殊變數 $/ 與 $. : 
來個例子,說一個有意思的特殊內置變數, 參考代碼如下 : 
  1. $text = "C:\\tmp\\test.txt";  
  2. print "Open $text...\n";  
  3. open(FH,$text) or die("Can't open: $!");  
  4. my $line=readline(*FH);  
  5. close FH;  
  6. print $line;  
  7. # Test special variable $/  
  8. print "#=================#\n";  
  9. $/=undef;  
  10. open(FH,$text) or die("Can't open: $!");  
  11. my $line=readline(*FH);  
  12. close FH;  
  13. print $line;  
test.txt的內容是 : 
111111111111111111111111111
222222222222222222222222222
333333333333333333333333333

程序的運行結果是 : 
111111111111111111111111111
#===========================#
111111111111111111111111111
222222222222222222222222222
333333333333333333333333333

程序就不多廢話了,作用就是讀文件而函式 readline(*FH) 的作用是讀取一行文件內容. 但是這裡所說的一行,實際上是有一個標準的,那就是當 perl 在遇到了換行符後,便認為是一行,而換行符預設情況下是由於 $/ 這個特殊變數定義的,是預設值. 也就是說,perl 在每次讀取文件的時候,會先從 $/ 中獲得一個叫做 "分隔符" 的東西,並以該分隔符為標記來讀取文件,如果按預設的 $/ 來說,這個分割符就是一個換行符,所以,預設時,readline() 才會每次讀取一行文本. 

在給出的例子中,有這樣一句 : undef $/ ,也就是將$/設置為未定義的值,這樣一來呢,$/ 就不再起作用了,因此,大家可以看到,第二次進行同樣的操作的時候, readline() 就不再是只讀一行而是將文件內容全部讀出來了! 接下來看一個會受到 $/ 影響的內置變數,還是先說實例 : 
  1. $text = "C:\\tmp\\test.txt";  
  2. print "Open $text...\n";  
  3. open(FH,$text) or die("Can't open: $!");  
  4. while()  
  5. {  
  6.     print "line $. is : $_";  
  7. }  
  8. close FH;  
先來看循環中的 : print "line $. is:$_" 程序的作用是讀文件,並且將文件逐行賦值給 $_因為只用了<>操作符而沒有指定內賦值變數,因此預設就是賦值給了$_)但是這裡除了$_,還有一個變數$. . 執行結果如下 : 
Open C:\tmp\test.txt...
line 1 is : 111111111111111111111111111
line 2 is : 222222222222222222222222222
line 3 is : 333333333333333333333333333

可以知道變數 $. 的作用是一個類似計數器的東西. 接著考慮文件 a.txt : 
ddd;bbb;ccc;fff;eee;

並執行下面程式碼 : 
  1. $text = "C:\\tmp\\a.txt";  
  2. $/=";"; # 注意這裡,這裡我並將 $/ 賦值為分號  
  3. print "Open $text...\n";  
  4. open(FH,$text) or die("Can't open: $!");  
  5. while()  
  6. {  
  7.     print "line $. is : $_\n";  
  8. }  
  9. close FH;  
運行結果如下 : 
Open C:\tmp\a.txt...
line 1 is : ddd;
line 2 is : bbb;
line 3 is : ccc;
line 4 is : fff;
line 5 is : eee;

看過這段程序應該就明白 $. 的用法了吧, 接下來再說一個它的特性. 參考代碼如下 : 
  1. $text = "C:\\tmp\\test.txt";  
  2. print "Open $text...\n";  
  3. open(FH,$text) or die("Can't open: $!");  
  4. while()  
  5. {  
  6.     print "line $. is : $_";  
  7. }  
  8. print "\n==========\n";  
  9. print " ", $.;  
  10. close FH;  
  11. print " ", $.;  
看一下執行結果 : 
Open C:\tmp\test.txt...
line 1 is : 111111111111111111111111111
line 2 is : 222222222222222222222222222
line 3 is : 333333333333333333333333333
==========
3
 0

結果的前三行剛才就已經知道了,這不是我們關心的,我們應該關心的是最後一行結果. $. 變數是具有記憶性的(從原理上來將,它是一個包變數),因此,在關閉文件前打印會發現,它的值是還沒有變化的(這時的值和最後一次讀完文件的值均為3); 而在關閉文件後,該變數便重新初始化為0了 

特殊變數 $^O : 
再說最後一個用來簡單判斷操作系統類型的,看個例子 : 
>perl -e "print $^O"
MSWin32

注意,這裡這個特殊變數 $^O 最後一個字符是字母O,且大寫。 如果是在linux下的話,結果就不是MSWin32了,而是Linux ; 這是一個判斷環境的變數,簡單實用. 

其他常用特殊變數 : 
perl的內置特殊變數還有很多的,例如常用的還有@_@ARGV$ARGV%INC%ENV 等等,有很多,不可能一一列舉了,這裡給出一個比較有總結性的列表 : 
$- 當前頁可打印的行數,屬於Perl格式系統的一部分
$! 根據上下文內容返回錯誤號或者錯誤串
$” 列表分隔符
$# 打印數字時預設的數字輸出格式
$$ Perl解釋器的進程ID
$% 當前輸出通道的當前頁號
$& 與上個格式匹配的字符串
$( 當前進程的組ID
$) 當前進程的有效組ID
$* 設置1表示處理多行格式.現在多以/s和/m修飾符取代之.
$, 當前輸出字段分隔符
$. 上次閱讀的文件的當前輸入行號
$/ 當前輸入記錄分隔符,預設情況是新行
$: 字符設置,此後的字符串將被分開,以填充連續的字段.
$; 在仿真多維數組時使用的分隔符.
$? 返回上一個外部命令的狀態
$@ Perl解釋器從eval語句返回的錯誤消息
$[ 數組中第一個元素的索引號
$] Perl解釋器的子版本號
$^ 當前通道最上面的頁面輸出格式名字
$^A 打印前用於保存格式化數據的變數
$^D 調試標誌的值
$^E 在非UNIX環境中的操作系統擴展錯誤信息
$^F 最大的文件捆述符數值
$^H 由編譯器激活的語法檢查狀態
$^I 內置控制編輯器的值
$^L 發送到輸出通道的走紙換頁符
$^M 備用內存池的大小
$^O 操作系統名
$^P 指定當前調試值的內部變數
$^R 正則表達式塊的上次求值結果
$^S 當前解釋器狀態
$^T 從新世紀開始算起,腳步本以秒計算的開始運行的時間
$^W 警告開關的當前值
$^X Perl二進制可執行代碼的名字
$_ 預設的輸入/輸出和格式匹配空間
$| 控制對當前選擇的輸出文件句柄的緩衝
$~ 當前報告格式的名字
$` 在上個格式匹配信息前的字符串
$’ 在上個格式匹配信息後的字符串
$+ 與上個正則表達式搜索格式匹配的最後一個括號
$< 當前執行解釋器的用戶的真實ID
$1 含有與上個匹配正則表達式第一個括號結果 (如果有多個括號, 1 的數字可以替換成對應括號位置)
$= 當前頁面可打印行的數目
$> 當前進程的有效用戶ID
$0 包含正在執行的腳本的文件名
$ARGV 從預設的文件句柄中讀取時的當前文件名
%ENV 環境變數列表
%INC 通過do或require包含的文件列表
%SIG 信號列表及其處理方式
@_ 傳給子程序的參數列表
@ARGV 傳給腳本的命令行參數列表
@INC 在導入模塊時需要搜索的目錄列表
$-[0]$+[0] 代表當前匹配的正則表達式在被匹配的字符串中的起始和終止的位置

補充說明 : 
Tutorials Point : PERL readline Function 

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...