我會寫一個僞代碼如何在perl中使用全局變量?
f1 {
..
..
if (count==1) {
count=0;// set it back to 0
return $variable;
}
f2
{
count=1;
var2=f1(..); //
}
即。如果僅從f2調用f1,我想讓f1返回一個變量。否則不需要。我想用全局變量來實現這個。你能幫助嗎?或者還有其他方法嗎? Thanx提前。
我會寫一個僞代碼如何在perl中使用全局變量?
f1 {
..
..
if (count==1) {
count=0;// set it back to 0
return $variable;
}
f2
{
count=1;
var2=f1(..); //
}
即。如果僅從f2調用f1,我想讓f1返回一個變量。否則不需要。我想用全局變量來實現這個。你能幫助嗎?或者還有其他方法嗎? Thanx提前。
使用全局變量通常是一個壞主意,因爲它們使代碼更難以維護(正如評論中的@choroba所提到的)並編寫代碼。
正如@Borodin提到的,如果f1
應該只return
如果調用由f2
並沒有什麼事,否則,最簡單的就是讓f1
回報的東西,不管它被稱爲由f2
與否,只是忽略了返回值如果你不在f2
。
但是,如果f1
需要從f2
調用時返回一個特殊值,以及一些從別的地方叫別人時,有幾種可能性:你可以將參數傳遞給f1
將確定誰的說法。或者您可以使用caller
來了解誰叫f1
。或者,如果你真的想,你可以使用一個全局變量。貝婁是每種方式的例子。
(你可以代替我say
與return
。)
使用caller
:
use strict;
use warnings qw(all);
use feature qw(say);
sub f1 {
my $caller = (caller(1))[3];
if ($caller && $caller eq 'main::f2') {
say "Called from f2";
} else {
say "Not called from f2";
}
}
sub f2 {
f1();
}
f1();
f2();
caller
返回一個包含在當前的功能是從(線,呼包信息的數組,功能等)。這個數組的第四個元素是調用它的函數,完全符合它的包,因此使用main::f2
而不僅僅是f2
。
使用一個附加參數:
use strict;
use warnings qw(all);
use feature qw(say);
sub f1 {
my $caller = shift // '';
if ($caller eq 'f2') {
say "Called from f2";
} else {
say "Not called from f2";
}
}
sub f2 {
f1('f2');
}
f1();
f2();
在本例中,參數以f1
是可選的。但是,如果f1
具有其他參數,則可以考慮將其設爲非可選。
使用全局變量:
use strict;
use warnings qw(all);
use feature qw(say);
our $f1_flag = 0;
sub f1 {
if ($f1_flag == 1) {
say "Called by f2";
} else {
say "Called outside f2";
}
}
sub f2 {
local $f1_flag = 1;
f1();
}
f1();
f2();
你會注意到,我重新命名爲$count
$f1_flag
:它已經夠糟有全局變量,所以最好還是儘量給他們顯著的名字。 (這樣,你不應該知道這個變量是什麼,並且你可能不會重複使用同一個名字作爲另一個變量)。
our
聲明一個全局(或包)變量。然後,而不是將其設置爲1
內f2
,然後回到0
內f1
,我更喜歡使用local
:$f1_flag
將1
爲f2
動態範圍內的每個函數或指令。
你也可以基於上下文。 'if(defined(wantarray)){...}' – ikegami
目前尚不清楚你想要什麼。不建議使用全局變量,因爲它們使代碼難以維護。 – choroba
爲什麼不傳遞參數給函數? – choroba
你應該總是從'f1'返回'$ variable',如果不需要它就忽略它。 – Borodin