preload
Oct 18

先來一個例子吧

#!/usr/bin/perl

use warnings;

@array = qw(a b c d);

foreach (@array) {

print $_,” “;

}

例子的作用就是定義一個數組並把其中的元素打印出來,這裡需要注意的是foreach循環部分,foreach循環的標準格式應該是:

foreach $element (@array){

……

}

其中數組@array將其中的元素依次賦值給$element,但是在上面那個程序中,我並沒有這樣做,在程序中,我就使用到了perl中內置的一個特殊變數 $_

在程序第五行中:foreach (@array) 實際上就是等於 foreach $_ (@array),在這裡,$_是預設是輸入/輸出,因此,如果在程序中有類似的沒有明確聲明的變數位置的時候,就有可能能使用$_代替。

再看另外一個內置變數

perl -e “sleep(5);print qq(The PID of process perl.exe is : $$)”;


這是一句命令行上使用的perl程序,作用就是打印出一段話:print qq(The PID of process perl.exe is : $$) ,在這裡,存在著特殊變數$$


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

接下來是一個用來返回錯誤信息(或是錯誤號)的特殊變數。

為了省事,不寫程序了,還是來個命令行的吧

perl -e “opendir FH,’c: one’ or die qq(can’t open:$!);”;


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

在這裡,$!就指明瞭錯誤信息的內容,命令行會返回錯誤信息:

can’t open:No such file or directory at -e line 1.

$!open或是opendir中用的比較多(無論是打開文件還是管道或是其他)。

來個例子,說一個有意思的特殊內置變數

$text = “C:\test.txt”;

{

open FH,$text or die “can’t open:$!”;

my $line = ;

close FH;

print $line;

}

print “#===========================# “;

{

undef $/;

open FH,$text or die “can’t open:$!”;

my $line = ;

close FH;

print $line;

}

=================================

C盤下的test.txt的內容是:

111111111111111111111111111

222222222222222222222222222

333333333333333333333333333

=================================

好,程序的運行結果是:

111111111111111111111111111

#===========================#

111111111111111111111111111

222222222222222222222222222

333333333333333333333333333

程序就不多廢話了,作用就是讀文件,關鍵部分在$line =,尖括號操作符(即,<>)作用是讀取一行文件內容(相信大多數教程或是書上都是這麼寫的),但是,這裡所說的一行,實際上是有一個標準的,那就是當perl在遇到了換行符後,邊認為是一行,而換行符預設情況下是由於$/這個特殊變數定義的,是預設值。

也就是說,perl 在每次使用<>操作符讀文件的時候,會先從$/中獲得一個叫做分隔符的東西,並以該分隔符為標記來讀取文件,如果按預設的$/來說,這個分割符就是一個換行符,所以,預設時,<>操作符才會每次讀取一行文本。

在給出的例子中,有這樣一句 undef $/ ,也就是將$/設置為未定義的值,這樣一來呢,$/就不再起作用了,因此,大家可以看到,第二次進行同樣的操作的時候, <>操作符就不再是只讀一行而是將文件內容全部讀出來了。

接下來看一個會受到$/影響的內置變數,還是先說實例:

$text = “C:\test.txt”;

open FH,$text or die “can’t open:$!”;

while () {

print “line $. is:$_”;

}

close FH;


先來看循環中的:print “line $. is:$_”

程序的作用是讀文件,並且,將文件逐行賦值給$_(因為只用了<>操作符而沒有指定內賦值變數,因此,預設就是賦值給了$_);

但是這裡除了$_,還有一個變數$.

我們來看一下結果:

line 1 is:111111111111111111111111111

line 2 is:222222222222222222222222222

line 3 is:333333333333333333333333333

可見,變數$.的作用是一個類似計數器的東西,但是,為甚麼剛開始我說$.會受到$/變數的影響呢

將上面的例子稍做修改,再看一下:

$text = “C:\test.txt”;

undef $/; # 注意,多加了這一行

open FH,$text or die “can’t open:$!”;

while () {

print “line $. is:$_”;

}

close FH;


第二行多加了一句undef $/; ,上面已經說過它的作用了,來看一下這段程序運行的結果:

line 1 is:111111111111111111111111111

222222222222222222222222222

333333333333333333333333333

本來應該是三行的文本,不但被一次性打印出來,而且還指明瞭“line 1(看來程序認為這個文本只有一行),為甚麼?

這是因為$.變數並不是一個單純的行計數器,確切地說,可以說$.是一個對$/計數器,我們再來看一段程序大概就會明白了:

$text = “C:\a.txt”;

$/ = “;”; # 注意這裡,這裡我並將$/設置為未定義,而是給其賦值為分號

open FH,$text or die “can’t open:$!”;

while () {

print “line $. is:$_ “;

}

close FH;


再看一下C盤下的a.txt的內容:

ddd;bbb;ccc;fff;eee;

就這麼簡單了。

看一下運行結果:

line 1 is:ddd;

line 2 is:bbb;

line 3 is:ccc;

line 4 is:fff;

line 5 is:eee;

看過這段程序應該就明白了吧。

好,$.已經講得差不多了,接下來再說一個它的特性,仍然是看程序說話:

$text = “C:\test.txt”;

open FH,$text or die “can’t open:$!”;

while () {

print “line $. is:$_ “;

}

print ” “,$.;

close FH;

print ” “,$.;


這個程序要注意的是最後三行中的兩個print ” “,$.;(一個是在關閉文件前,另外一個則是在關閉文件後)。

看一下執行結果:

line 1 is:111111111111111111111111111

line 2 is:222222222222222222222222222

line 3 is:333333333333333333333333333

3

0

結果的前三行剛才就已經知道了,這不是我們關心的,我們應該關心的是最後兩行結果(即兩個print ” “,$.;的結果);

$.變數是具有記憶性的(從原理上來將,它是一個包變數),因此,在關閉文件前打印會發現,它的值是還沒有變化的(這時的值和最後一次讀完文件的值均為3);

而在關閉文件後,該變數又被重新初始化為0了。

這個特性大家注意一下就可以了,因為其中的原理涉及到了perl的作用域和包的一些知識,不是很容易說清楚,所以就不說了,如果對包和作用域有瞭解的讀者對這部分即使我不講他們也應該能理解的。

再說最後一個吧

說一個用來簡單判斷操作系統類型的,看個例子:

C:>perl -e “print $^O;”;

MSWin32

注意,這裡這個特殊變數$^O 最後一個字符是字母O,且大寫。

如果是在linux下的話,結果就不是MSWin32了,而是Linux 

這是一個判斷環境的變數,簡單實用。

perl的內置特殊變數還有很多的,例如常用的還有@_@ARGV$ARGV%INC%ENV等等,有很多,不可能一一列舉了,這裡給出一個比較有總結性的列表,是chinaunixperl社區的一個網友總結的,還算比較全:

$- 當前頁可打印的行數,屬於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

$ 含有與上個匹配正則表達式對應括號結果

$= 當前頁面可打印行的數目

$> 當前進程的有效用戶ID

$0 包含正在執行的腳本的文件名

$ARGV 從預設的文件句柄中讀取時的當前文件名

%ENV 環境變數列表

%INC 通過dorequire包含的文件列表

%SIG 信號列表及其處理方式

@_ 傳給子程序的參數列表

@ARGV 傳給腳本的命令行參數列表

@INC 在導入模塊時需要搜索的目錄列表

$-[0]$+[0] 代表當前匹配的正則表達式在被匹配的字符串中的起始和終止的位置。

via 举例说明PERL特殊变量,CGI-Perl技术文章,CGI-Perl系列教程,CGI-Perl

溫故知新

載入中…

歷史上的今天..

相關文章:

Tagged with:

Leave a Reply