perl中my和our的區別分析

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

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變數之間的區別

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

Scrapy中的Request和日誌分析

scrapy http request 自動去重,根據url的雜湊值,進行去重 屬性meta dict 在不同的請求之間傳遞資料,dict priority int 此請求的優先順序 預設為0 dont filter boolean 關閉自動去重 errback callable 在處理請求時引發任何...

jquery中attr和prop的區別分析

這篇文章主要介紹了jquery中attr和prop的區別分析的相關資料 需要的朋友可以參考下 在高版本的jquery引入prop方法後,什麼...