如何將子程序變量值傳送到另一個子程序變量中,我可以使用全局變量。全局變量,子程序變量Perl中的問題
sub foo(){
my $myvar = "Hello";
}
sub foo1(){
my $myvar1 = $myvar; # how can I get the "Hello" from $myvar.
}
我試過使用包和全局變量,但失敗了。
Package Bar;
our $bar;
謝謝。
如何將子程序變量值傳送到另一個子程序變量中,我可以使用全局變量。全局變量,子程序變量Perl中的問題
sub foo(){
my $myvar = "Hello";
}
sub foo1(){
my $myvar1 = $myvar; # how can I get the "Hello" from $myvar.
}
我試過使用包和全局變量,但失敗了。
Package Bar;
our $bar;
謝謝。
你可以聲明變量,其中包括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關於原型的討論)
你有幾種方法。
最簡單的是不要用my
聲明變量。但是這需要您避免use strict;
而不是推薦的結果。
您可以在腳本頂部聲明變量以外的函數。這個變量可以在下面的所有函數中使用。這是scope的後果:在一組大括號之外聲明的變量通常在隨後的大括號內可用。
您可以使用use vars qw/$myvar/;
編譯指示聲明變量。這固有地使你的變量在下面的代碼中可用。
只要不使用my
:
#!/usr/bin/perl
sub foo() {
$myvar = "Hello\n";
}
sub foo1() {
$myvar1 = $myvar;
print $myvar1;
}
print "here we go!\n";
foo();
foo1();
不過,我不推薦這種編程方式。
我對這個問題的downvoting有點不滿意。評論足以指出這種做法可能會產生後果。然而關於Perl的一個關鍵語句是「有多種方法可以做到這一點」(TIMTOWTDI)。相互殘殺並說只有一個真正的方法可以破壞Perl社區。這個回覆的作者是真誠的,也許並沒有壓低這個職位,但是人們可以把好的職位改爲投票。 Downvoting最適合偏離主題的答案或故意煽動性,而這篇文章既不是。 – 2010-06-04 23:11:49
你能解釋我爲什麼你在上面壓低我的答案嗎?是否因爲我對「這種編程方式」的評論? – MarcoS 2010-06-28 09:29:41
我在這裏看到的主要問題是(沒有人選擇提及,只是覺得下調答案或添加沒有正當理由的神祕派對就足夠了)是它使用隱式全局變量。這是皺眉(任何全局名稱都可以使用,無論它是否聲明=>沒有編譯時檢測變量拼寫錯誤,沒有變量的範圍=>微妙的錯誤),這是爲什麼使用嚴格/警告是這樣的原因之一一個好主意。 – ijw 2010-08-24 13:48:34
如何將子程序變量值傳送到另一個子程序變量中,我可以使用全局變量嗎?
是的,你可以:
my $myvar;
sub foo(){
$myvar = "Hello";
}
sub foo1(){
my $myvar1 = $myvar; # how can I get the "Hello" from $myvar.
}
這甚至與作品 「使用嚴格的;」和「使用警告」。
我試過使用包和全局變量,但失敗了。
包變量適用於要在包外部導出的變量,而不是要在同一包中的兩個子例程之間共享的變量。
下面的代碼可以顯示解決你的描述:
#!/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
這聞起來像一個X/Y的問題。如果你詢問你的實際問題(X)而不是你認爲你能解決的問題(Y),你會得到更好的答案。 – 2010-06-04 13:37:38
包裹拼寫'包裹'而不是'包裹'。現在,perl把它看作是'Bar-> Package();'(調用'Bar'包的方法'Package') – 2010-06-04 14:24:23