有幾件事情需要在這裏瞭解關於變量,以及Perl中,並使用它們。
當您聲明$x
並指定值4
時,您實際上是在定義一個包變量。如果不使用strict
編譯指示(通過使用use strict 'vars'
或use strict
啓用),則不必在變量聲明前面加上my
或our
。因此,Perl將默認初始化爲$x
作爲包變量。軟件包通過package
關鍵字設置,如果省略,那麼perl默認爲main
軟件包。這意味着您創建了一個名爲$main::x
的包變量,其值爲4
。在保留包main
的同時,您可以使用別名$x
來表示$main::x
。
包變量可以在你的主包範圍內的任何地方使用的(通常被稱爲全局變量),這就是爲什麼你可以在子程序routine()
訪問$x
。
local
將在聲明的範圍期間存儲$x
的值,直到它聲明的範圍結束。因此,在您的示例中,local
聲明的範圍適用於整個範圍routine()
(之間使用local
,並在routine()
聲明中關閉}
大括號)。離開示波器時,它將$x
重新初始化爲存儲值。這就是爲什麼調用routine()
後的打印語句顯示$x
爲4
。
首先回答你眼前的問題:
因爲local
是特定於它是利用在封閉,可以在routine()
創建一個單獨的封用。這樣,您就可以在該範圍內的定位$x
,但你的子程序中保留的$x
包變量:
#! /usr/bin/perl
$x=4; # declare a package variable $main::x
routine();
print "value of x in main is $x\n";
sub routine {
# now create a closure, so we can localize the package variable
# within its own scope
{
local $x = 10;
print "value of x routine, within locally scoped closure is $x\n";
}
print "value of x _from_ main is $x\n"; #will now print 4
}
在其他的答案談到,在Perl的最佳做法是使用strict標記,以及要求警告當檢測到錯誤的編碼:
use strict;
use warnings 'all';
這樣運行你的代碼,然後給出:
Global symbol "$x" requires explicit package name
。
我們可以用幾種方法解決這個問題,我們可以用一個包名聲明它:
$main::x = 4;
然後還要implictly引用它在代碼的其餘部分爲$main::x
。
或者,如果我們願意有機會獲得別名,我們可以使用關鍵字our
聲明$main::x
作爲一個包變量,然後把它稱爲$x
在我們代碼的其餘部分。
our $x=4; # (is the same as writing $main::x = 4, but you also
# can refer to it by its alias $x from this point onwards).
有了這些點覆蓋,那麼你可以有最終的推薦方案:
#! /usr/bin/perl
use strict;
use warnings 'all';
our $x=4; # declare a package variable $main::x
routine();
print "value of x in main is $x\n";
sub routine {
# now create a closure, so we can localize the package variable
# within its own scope
{
local $x = 10;
print "value of x routine, within locally scoped closure is $x\n";
}
print "value of x _from_ main is $x\n"; # will now print 4
}
額外信息
注意局部變量保持在範圍內,即使其他子程序中調用那範圍:
our $x=4;
routine();
sub routine {
{
local $x = 10;
print "routine() localized, x is $x\n";
another_routine();
}
print "routine() x is $x\n";
}
sub another_routine {
print "another_routine() still localized, x is $x\n";
}
將輸出:
routine() localized, x is 10
another_routine() still localized, x is 10
routine() x is 4
我們都沒有碰過開放詞法變量由my
關鍵字(有時被稱爲私有變量或我的變量)聲明。這些行爲是不同的,他們只活過他們在範圍內的期限(技術上直到他們的引用計數變爲0,但這是另一個話題!)。這使我們能夠宣佈其(例如)只得到您的routine()
子程序期間創建和使用的變量:
sub routine {
my $y = 20;
print "y is set to $y during the duration of routine()\n";
}
my
也有讓我們重新使用包變量名的潛移默化的影響,並使用私人 。該變量,因爲他們在被宣佈範圍的持續時間值注意,他們沒有表現得像局部變量和範圍內調用其他程序會默認使用包變量值:
our $x=4;
routine();
sub routine {
my $x = 20;
print "routine() x is $x\n";
another_routine();
}
sub another_routine {
print "another_routine() x is $x\n";
}
將輸出:
routine() x is 20
another_routine() x is 4
$x
內routine()
是私人到routine()
只有routine()
。
我希望lanuague足夠清楚明白!
你期望打印'10'和'4'的值嗎? –