的正確方法,我有以下在file_1.pl可變全球,在包主:更新一個Perl的全局變量
package main;
my $var = -1;
如果我需要從另一個perl的文件更新這個變量,有什麼辦法做到這一點?我試過了:
$main::var = 1
但它沒有奏效。
這樣做的正確方法是什麼?
謝謝!
的正確方法,我有以下在file_1.pl可變全球,在包主:更新一個Perl的全局變量
package main;
my $var = -1;
如果我需要從另一個perl的文件更新這個變量,有什麼辦法做到這一點?我試過了:
$main::var = 1
但它沒有奏效。
這樣做的正確方法是什麼?
謝謝!
您必須聲明與our
否則將被視爲詞法可變的變量,因此改變像
our $var = -1;
您可以創建一個包裝函數。
在主文件
our $var;
sub updateGlobal {
$var = shift;
}
在其他文件只需要調用一個函數
updateGlobal(1);
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; }
}
+1的詳細答案。 – Izza 2012-04-06 14:46:28
可以請擴展爲什麼downvote? – 2012-04-05 11:50:35
我只是猜測,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
也許,從術語。 「局部變量」意味着與「本地」功能有關。詞彙變量與「本地」無關。 – 2012-04-05 13:18:30