2010-06-04 71 views
4

如何將子程序變量值傳送到另一個子程序變量中,我可以使用全局變量。全局變量,子程序變量Perl中的問題

sub foo(){ 

my $myvar = "Hello"; 
} 

sub foo1(){ 
my $myvar1 = $myvar; # how can I get the "Hello" from $myvar. 
} 

我試過使用包和全局變量,但失敗了。

Package Bar; 
our $bar; 

謝謝。

+2

這聞起來像一個X/Y的問題。如果你詢問你的實際問題(X)而不是你認爲你能解決的問題(Y),你會得到更好的答案。 – 2010-06-04 13:37:38

+2

包裹拼寫'包裹'而不是'包裹'。現在,perl把它看作是'Bar-> Package();'(調用'Bar'包的方法'Package') – 2010-06-04 14:24:23

回答

13

你可以聲明變量,其中包括2個功能範圍:

{ my $myvar 

    sub foo{ 
    $myvar = "Hello"; 
    } 

    sub foo1{ 
    my $myvar1 = $myvar; 
    } 
} 

,雖然不是真正的優雅,可能很難維持,因爲它是不明確的foo1其中的價值$myvar已設置。將變量作爲參數傳遞可能會更好。

sub foo { 
    my $myvar = "Hello"; 
    return $myvar; 
} 

sub foo1 { 
    my($myvar)= @_; 
    my $myvar1 = $myvar; 
} 

# calling code 
my $myvar= foo(); 
foo1($myvar); 

請注意,所有3 $myvar是不同的變量,在不同的範圍。

作爲一個側面說明,使用原型(sub foo())可能不是一個好主意,除非你真的知道自己在做什麼,這很可能不是這樣的情況(見The problem with prototypes關於原型的討論)

2

你有幾種方法。

最簡單的是不要用my聲明變量。但是這需要您避免use strict;而不是推薦的結果。

您可以在腳本頂部聲明變量以外的函數。這個變量可以在下面的所有函數中使用。這是scope的後果:在一組大括號之外聲明的變量通常在隨後的大括號內可用。

您可以使用use vars qw/$myvar/;編譯指示聲明變量。這固有地使你的變量在下面的代碼中可用。

4

只要不使用my

#!/usr/bin/perl 

sub foo() { 
    $myvar = "Hello\n"; 
} 

sub foo1() { 
    $myvar1 = $myvar; 
    print $myvar1; 
} 

print "here we go!\n"; 
foo(); 
foo1(); 

不過,我不推薦這種編程方式。

+2

我對這個問題的downvoting有點不滿意。評論足以指出這種做法可能會產生後果。然而關於Perl的一個關鍵語句是「有多種方法可以做到這一點」(TIMTOWTDI)。相互殘殺並說只有一個真正的方法可以破壞Perl社區。這個回覆的作者是真誠的,也許並沒有壓低這個職位,但是人們可以把好的職位改爲投票。 Downvoting最適合偏離主題的答案或故意煽動性,而這篇文章既不是。 – 2010-06-04 23:11:49

+0

你能解釋我爲什麼你在上面壓低我的答案嗎?是否因爲我對「這種編程方式」的評論? – MarcoS 2010-06-28 09:29:41

+2

我在這裏看到的主要問題是(沒有人選擇提及,只是覺得下調答案或添加沒有正當理由的神祕派對就足夠了)是它使用隱式全局變量。這是皺眉(任何全局名稱都可以使用,無論它是否聲明=>沒有編譯時檢測變量拼寫錯誤,沒有變量的範圍=>微妙的錯誤),這是爲什麼使用嚴格/警告是這樣的原因之一一個好主意。 – ijw 2010-08-24 13:48:34

5

如何將子程序變量值傳送到另一個子程序變量中,我可以使用全局變量嗎?

是的,你可以:

my $myvar; 
sub foo(){ 
    $myvar = "Hello"; 
} 

sub foo1(){ 
    my $myvar1 = $myvar; # how can I get the "Hello" from $myvar. 
} 

這甚至與作品 「使用嚴格的;」和「使用警告」。

我試過使用包和全局變量,但失敗了。

包變量適用於要在包外部導出的變量,而不是要在同一包中的兩個子例程之間共享的變量。

0

下面的代碼可以顯示解決你的描述:

#!/usr/bin/perl 
use strict; 
my $var = "hello"; 
sub foo { 
    local *var; 
    print "$var world\n"; 
    $var = "hi"; 
} 

sub bar { 
    local *var; 
    print "$var world\n"; 
    $var = "hey"; 
} 

foo(); 
bar(); 
print "$var world\n"; 

結果應該是:

hello world 
hi world 
hey world