2017-03-02 18 views
0

我會寫一個僞代碼如何在perl中使用全局變量?

f1 { 
.. 
.. 
if (count==1) { 
count=0;// set it back to 0 
return $variable; 
} 


f2 
{ 
count=1; 
var2=f1(..); // 
} 

即。如果僅從f2調用f1,我想讓f1返回一個變量。否則不需要。我想用全局變量來實現這個。你能幫助嗎?或者還有其他方法嗎? Thanx提前。

+2

目前尚不清楚你想要什麼。不建議使用全局變量,因爲它們使代碼難以維護。 – choroba

+1

爲什麼不傳遞參數給函數? – choroba

+1

你應該總是從'f1'返回'$ variable',如果不需要它就忽略它。 – Borodin

回答

4

使用全局變量通常是一個壞主意,因爲它們使代碼更難以維護(正如評論中的@choroba所提到的)並編寫代碼。

正如@Borodin提到的,如果f1應該只return如果調用由f2並沒有什麼事,否則,最簡單的就是讓f1回報的東西,不管它被稱爲由f2與否,只是忽略了返回值如果你不在f2

但是,如果f1需要從f2調用時返回一個特殊值,以及一些從別的地方叫別人時,有幾種可能性:你可以將參數傳遞給f1將確定誰的說法。或者您可以使用caller來了解誰叫f1。或者,如果你真的想,你可以使用一個全局變量。貝婁是每種方式的例子。

(你可以代替我sayreturn。)


使用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聲明一個全局(或包)變量。然後,而不是將其設置爲1f2,然後回到0f1,我更喜歡使用local$f1_flag1f2動態範圍內的每個函數或指令。

+0

你也可以基於上下文。 'if(defined(wantarray)){...}' – ikegami