2012-04-05 144 views
2

的正確方法,我有以下在file_1.pl可變全球,在包主:更新一個Perl的全局變量

package main; 

my $var = -1; 

如果我需要從另一個perl的文件更新這個變量,有什麼辦法做到這一點?我試過了:

$main::var = 1 

但它沒有奏效。

這樣做的正確方法是什麼?

謝謝!

回答

3

您必須聲明與our否則將被視爲詞法可變的變量,因此改變像

our $var = -1; 
+0

可以請擴展爲什麼downvote? – 2012-04-05 11:50:35

+2

我只是猜測,downvote來自於這個問題使用了「正確的方式」這個詞,你只是在Perl中向他展示了全局變量*完成*,當FAQ-ish「正確答案」是1)使用詞法只要有可能,2)檢查並看看一個詞彙*是否能夠符合你的目的,3)使用包裝方法,就像在下面的Brian的回答中一樣,4)如果你不能做其他事情,儘可能將它們設置爲* local *範圍。 '{local $ PackageVar = -1; do_something_with_PackageVar(); }#在這裏$ PackageVar未設置。# – Axeman 2012-04-05 12:45:34

+1

也許,從術語。 「局部變量」意味着與「本地」功能有關。詞彙變量與「本地」無關。 – 2012-04-05 13:18:30

1

您可以創建一個包裝函數。

在主文件

our $var; 
sub updateGlobal { 
    $var = shift; 
} 

在其他文件只需要調用一個函數

updateGlobal(1); 
8

my是一個詞彙變量。它的作用域是塊,或者如果不在塊中,則作用於該文件。他們不能在他們的範圍之外看到。

您可以創建一個全局變量,其他的答案顯示:

our $var; 

然而,更好的辦法是給代碼的其他部分的接口來更新詞彙版本:

my $private; 

sub set_private { $private = shift } 

但是,如果你打算這麼做,那麼你也可以有一個獲取價值的界面。現在,變量只需要在同一個範圍,因爲使用它的子程序,這樣你就可以從文件的其餘部分隱藏:

{ 
my $private; 
sub set_private { $private = shift } 

sub get_private { $private } 
} 

現在,您只差一個步驟就可以一個對象(在這種情況下,一個單身人士):

use v5.12; 

package Foo { 
    my $private; 
    sub new { bless \$private, shift } 
    sub set { my $self = shift; $$self = shift; } 

    sub get { my $self = shift; $$self; } 
    } 
+0

+1的詳細答案。 – Izza 2012-04-06 14:46:28