perl中my和our的區別分析

2022-08-05 14:21:25 字數 1838 閱讀 3424

perl中our的用法

require 5.006

當版本號小於 5.006 的時候,會返回失敗,從而導致模組載入失敗。

所以它的作用就是保證模組呼叫環境的 perl 版本。

our 和 my 一樣,都是對變數的宣告,

不過 our 宣告的是包全域性變數,

而 my 宣告的是詞法變數。

不過,經過 our 宣告的變數,它會變得像乙個詞法變數一樣,

其實這也是 our 存在的目的:用來欺騙 strict pragma,使 strict 以為它是乙個詞法變數,其實卻不是。

有乙個簡單的辦法可以理解 our:

1,你就把 our 宣告的變數和 my 宣告的當成一樣。

2,記住 our 和 my 的區別:our 宣告的是乙個包全域性變數,因此在符號表中儲存(可以通過全限定在任何地方訪問),而 my 宣告的是乙個真正的詞法變數,只能在閉合塊中訪問。

**例子

**如下:

1

my$var = 1;2

3489

print

$var, "

\n";

輸出:

2

1

**如下:

1

our$var = 1;2

3489

print

$var, "

\n";

輸出:

2

2

perl中our的用法

其實,our 的出現有它的歷史,

perl 和別的語言不同,可以隨便宣告變數,

在 perl 4 那個時代,根本就不需要 my 什麼的,

隨便寫個名字,就是變數了。

在 perl 5 中仍然如此,除非你用 my 明確宣告為詞法變數,否則所有的變數都是(包)全域性變數,而且可以不宣告直接使用。

但是,這樣有個壞處,那就是萬一不小心寫錯名字了,或者解符號引用的時候,字串運算錯了,都會造成很多麻煩(因為按照 perl 5 語法,這些都是正確的,其結果就是產生乙個新的變數,很顯然,這不是你想要的目的。)

所以,為了解決這些問題,在 perl 5 中就引入了 strict 和 warnings 兩個 pragma,它們的作用,就是限制變數不宣告直接使用,

經過 strict 和 warnings 限制後,所有沒有宣告的直接使用的變數都會報錯。但是 my 宣告的變數又是區域性變數,local 又不能創造變數,

所以,我們就沒法使用全域性變數了(注1),

因此就又引入了 our,our 的作用就是宣告乙個全域性變數,但是讓 strict 和 warnings 以為它是詞法變數,因此 our 宣告的變數也是詞法作用域的。但是實際上它是全域性變數。

注1:如果不使用 our,我們有兩種辦法可以建立全域性變數:

1,用 no strict "vars" 臨時關掉 strict pragma,宣告完了再用 use strict "vars" 開啟。

2,用變數的全限定名稱,如 $main::var 或者 $foo::bar 這樣子。

usepackage

our三者之間無任何關係。

use 是載入乙個 .pm 檔案,

package 是切換當前名字空間,

our 是在當前名字空間中建立乙個變數,如果該變數已經存在,則 our 只起到乙個宣告的作用。

our (或者什麼修飾都沒有)宣告的是「包全域性變數」,它的是「依附」在「包」上面的,它的儲存位置是「包符號表」,

my 宣告的是「詞法變數」,它是「依附」在「**塊」上的,它的儲存位置是「**塊」的「變數標籤薄」,所以詞法變數不可以從**塊之外訪問(除了傳遞引用)。

但是包全域性變數就不同了,用全限定就可以訪問。

perl中my local和our區別與聯絡

our 把名字限於某個範圍 其實就是明確宣告乙個 全域性變數 雖然是在某個模組或者函式裡面定義的,外面的也可以訪問,如果已經宣告過了,再次用 our 表示此處用的是全域性的那個,不是同名的私有或者區域性變數 our program name waiter 這裡執行的 看到的仍然是 server my...

perl中my與local的區別

x 9 sub mm sub gg my sub gg local gg my gg local print x 輸出結果是 call my 11 9 call local 20 20 9 可以看出,local函式在建立全域性變數的乙個區域性例項後即可 將它傳遞給任何子例程並繼續進行區域性初始賦值。...

perl中my變數和local變數之間的區別

usr bin perl my 和 local的區別,my local都只能在乙個block中使用,但是local可以在該block的子程式中呼叫 但是沒有不可以 我們可以使用 local 為全域性變數提供臨時的值,在退出作用域後將原來的值還回去。local 定義的變數不存在於主程式中,但存在於該子...