2012-12-30 26 views
2

我正在寫一個梅森1.x組件頁面,它不像我期待的那樣。 perlsub手冊頁指示my變量應在sub內可訪問。但是,下面的代碼:爲什麼我的``我的`變量可以在子內部訪問?

my @myOrderBy = @orderBy; 
sub sortAll 
{ 
    my $ret = 0; 
    foreach my $sortStr (@myOrderBy) 
    { 
    } 
} 

是給我的錯誤:

Error during compilation of /opt/rt4/local/plugins/RTx-Foo/html/cf/helpers/ticketQuery.ajx: Variable "@myOrderBy" is not available at /opt/rt4/local/plugins/RTx-Foo/html/cf/helpers/ticketQuery.ajx line 206.

(線206是foreach線)

相同的代碼工作正常,在非梅森上下文。

回答

8

梅森顯然包裝你的代碼在一個子(如mod_perl呢)。這意味着你最終的東西像

$ perl -we'sub { my $x; sub sortAll { $x } }' 
Variable "$x" is not available at -e line 1. 

的解釋是,只要複雜,但它歸結爲:Perl不支持嵌套命名的潛艇。試圖這樣做會導致奇怪的錯誤。

在這種情況下,我建議你使用local our $x;而不是my $x;

+1

或'* sortAll = sub {'而不是'sub sortAll {'' – ysth

-3

my變量僅在聲明它們的代碼塊內可見。sub是一個不同的代碼塊,因此@myOrderBy在其中不可用。見http://www.perlmonks.org/index.pl?node_id=66677

+3

不,這是不正確的。正如我上面所說,代碼在非Mason環境中工作。此外,'man perlsub'說 '這並不意味着在靜態封閉的詞法範圍中聲明的「我的」變量將不可見。只有動態範圍是 切斷。例如,下面的「bumpx()」函數可以訪問詞法$ x變量,因爲「my」和「sub」 發生在相同的作用域,可能是文件作用域。 my $ x = 10; sub bumpx {$ x ++}' –

1

您不應該在Mason組件中使用命名空間,命名空間是共享的。改爲:

my $ sortall = sub {...};

相關問題