Perl是上下文相關的,與很多其它語言有所不同。Perl中的運算和值的解釋有時候依賴於圍繞此運算或值的上下文。上下文包括數字、字串、列表和標量。最常用到的有兩種上下文:標量上下文和列表上下文。
返回列表值的運算需要一個列表,標量也一樣。也就是說,Perl基於期望的傳回值是單數還是複數來重載一定的運算。在標量上下文中,所求的運算式返回一個標量值;而在列表上下文中,所求的運算式返回一個標量值的列表。這就是兩者之間的區別。
標量上下文對資料是作為數字進行運算還是作為字串進行運算有影響;而列表上下文則對指派陳述式返回的資料以及子程式或系統函數的參數和傳回值有影響;
相應地,函數為每一個參數提供一個標量上下文和一個列表上下文。
例1:int(<STDIN>);
這個函數為它的參數提供了一個標量上下文;由於這個函數是要把它的參數轉換成一個整數,只需要一個標量參數就可以了,所以,<STDIN>操作就唯讀進去一個標量資料作為參數傳遞給int(),如果輸入了多個資料,則只傳遞第一個資料給函數int(),並返迴轉換後的整數標量值。
例2:sort(<STDIN>);
這個函數是對一個列表中的元素進行排序,它需要一個列表作為參數來操作,所以這個函數為<STDIN>操作提供了一個列表上下文;所以,Perl解譯器會把<STDIN>操作所產生的所有輸入的元素作為列表元素封裝到一個列表中,然後把這個列表作為參數傳遞給sort()函數進行排序,當sort()函數執行完排序之後,會把排序後的所有資料元素再封裝到一個列表中,並把這個排序後的列表作為傳回值返回給sort()函數的上下文,即:列表上下文。
賦值操作符"="有點特別,它使用等號左邊的參數來決定等號右邊的參數的上下文。給一個標量變數賦值,就為等號右邊的參數值提供了一個標量上下文;為一個數組或數組的一個片段賦值,就為等號右邊的參數值提供了一個列表上下文;
使用者定義的子程式可能會關心它們是被一個標量上下文調用還是被一個列表上下文調用,但是大多數子程式不需要關心這些,因為標量變數會被自動地插入到一個列表中;
列表是資料容器中的一系列項目,在Perl中,列表是指一系列的標量值,產生列表上下文可以使用括弧,也可以使用數組。列表中也可以包含另一個列表,Perl解譯器會先把父列表中的所有子列表都轉化為一系列的標量變數,最後在父列表中列出所有的標量變數,包括子列表中的標量變數。在使用子程式時,這一點很重要。在使用包含子列表的列表時,Perl解譯器會先列出所有子列表中的標量變數,然後才會對整個列表進行處理。
例:
@Name = (LiuMin,WangYa,TongTong, LiuYing);
@Sex = ( ‘男’,‘女’);
@Age = (24,26,23,25);
@Friends = (@Name,@Sex,@Age);
上面語句中在為列表@Friends賦值之前,Perl解譯器會先解析其子列表@Name、@Sex、@Age,把它們先解析成對應的標量列表值,這樣列表(@Name,@Sex,@Age)的內容就變成內容為:
(LiuMin,WangYa,TongTong, LiuYing,‘男’,‘女’,24,26,23,25)
的這樣一個新的列表了,然後再把這個新的列表賦值給列表@Friends,最後,列表@Friends的形式就是下面這樣的:
@Friends = (LiuMin,WangYa,TongTong, LiuYing,‘男’,‘女’,24,26,23,25);
Perl解譯器解析子列表的順序是從左至右。當列表用於子程式或者函數調用時,也會遵循這樣的原則;