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 宣告的是乙個真正的詞法變數,只能在閉合塊中訪問。
**例子
**如下:
1my$var = 1;2
3489
$var, "
\n";
輸出:
21
**如下:
1our$var = 1;2
3489
$var, "
\n";
輸出:
22
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 定義的變數不存在於主程式中,但存在於該子...