1、範圍變量聲明 函數
一、our "把名字限於某個範圍「,其實就是明確聲明一個"全局變量",雖然是在某個模塊或者函數裏面定義的,外面的也能夠訪問,若是已經聲明過了,再次用"our",表示此處用的是全局的那個,不是同名的私有或者局部變量 spa
二、my "把名字和值都限於限於某個範圍",簡單說,就是隻能本層模塊或者函數能夠看到這個變量,高一層的或者低一層的都看不到的。 it
三、local "把值侷限於某個範圍",也有叫"動態詞法範圍",有點很差懂。個人理解,就是本層和本層下層的函數能夠看到本層的變量,可是本層上一層的不能夠。到底範圍是多少,不只取決於本層的函數,還要看下一層的程序長度和深度,因此叫"動態範圍"。 io
在my沒有出現以前的權益方案,好比一個變量$!被定義成了全局變量,又想暫時使用一個也叫$!的臨時變量,則能夠用local,但在my出現之後,就沒必要使用local。 ast
四、state 變量
state $n = 0; # private, persistent variable $n perl
state @array = qw(a b c); # Error! 程序
state @array; 文件
@array = qw(a b c);#Right! co
五、全局變量
當你只有一個pl文件時,很簡單,把你的全局變量在文件頭部定義成our就行。在文件頭把變量定義成my, 也是全局可用的,可是冒了風險,假如在某個函數裏用my再定義一次,原來的值可就消失了。用our就不存在屢次定義會致使丟值的情況。
當你在寫一個有一個pl文件,N個pm文件的系統時該如何呢?事實上Perl裏的變量和函數名都有一個系統級的名字。好比說你在某pm文件的頭上定義了包名和全局變量
package bagua;
our $east = 'wood';
那麼在任何地方,任何pm和pl文件裏均可以使用$bagua::east來訪問這個變量。$bagua::east就被稱爲系統級名字。
若是你是在pl裏定義全局變量,並且該文件沒有定義package名字怎麼辦?Perl會生成一個缺省的package,名字叫"main"。因此若是你的pl文件是這樣
our $szVersion = '1.0.1";
那麼在其它文件裏就能夠用$main::szVersion來訪問,並不須要你定義package main.
最後,說一個邪門招式。你能夠試一下定義任意一個含有::的變量
our $gColor::Blue = '0x0000FF';
這個變量就在任何地方可用,哪怕你歷來沒有定義過gColor這個package。這個是Perl的靈活性的體現,它看到這個就自動生成了gColor這個名字空間。固然,我不鼓勵這種無厘頭的用法。
六、my local 區別
#!/usr/bin/perl
# not strict clean, yet, but just wait
$global = "I'm the global version";
show_me('At start');
lexical();
localized();
show_me('At end');
sub show_me
{
my $tag = shift;
print "$tag: $global\n"
}
sub lexical
{
my $global = "I'm in the lexical version";
print "In lexical(), \$global is --> $global\n";
show_me('From lexical()');
}
sub localized
{
local $global = "I'm in the localized version";
print "In localized(), \$global is --> $global\n";
show_me('From localized');
}
##############################################
運行結果是
***************************************************
At start: I'm the global version
In lexical(), $global is --> I'm in the lexical version
From lexical: I'm the global version
In localized(), $global is --> I'm in the localized version
From localized: I'm in the localized version
At end: I'm the global version
***************************************************
分析:
1.my和local都只在一個block裏有效,出去就失效
2.可是local的變量能夠繼續在這個block中調用的子程序中存在
3.若是有與外界同名的變量,二者在block退出後都不影響外界同名變量
our:
若是在一個block中有一個my修飾的變量和外界的一個變量同名,並且又須要在這個block中使用外接變量時,兩個辦法:
第一個辦法,用main的package修飾這個變量名,$main::global
第二個辦法,用our修飾,our $global,那麼該block中接下來出現的全部$global都是外界的global