如何在perl中使用全局变量?

如何在perl中使用全局变量?,perl,global-variables,Perl,Global Variables,我将编写一个伪代码 f1 { .. .. if (count==1) { count=0;// set it back to 0 return $variable; } f2 { count=1; var2=f1(..); // } 例如,如果仅从f2调用f1,我希望f1返回一个变量。否则就没有必要了。我想使用全局变量来实现这一点。你能帮忙吗。或者还有其他方法吗? 使用全局变量通常是个坏主意,因为它们使代码更难维护(正如@choroba在评论中提到的)和编写 正如@Borodin所提到的

我将编写一个伪代码

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


f2
{
count=1;
var2=f1(..); // 
}
例如,如果仅从f2调用f1,我希望f1返回一个变量。否则就没有必要了。我想使用全局变量来实现这一点。你能帮忙吗。或者还有其他方法吗?
使用全局变量通常是个坏主意,因为它们使代码更难维护(正如@choroba在评论中提到的)和编写

正如@Borodin所提到的,如果
f1
只应
返回
f2
调用的内容,否则什么也不返回,最简单的方法是让
f1
返回内容,不管它是否由
f2
调用,如果不在
f2
中,则忽略该返回值

但是,如果从
f2
调用时,
f1
需要返回一个特殊值,而从其他地方调用时需要返回其他值,则有几种可能性:您可以向
f1
传递一个参数,以识别调用它的人。或者你可以用来知道是谁打电话给
f1
。或者,如果你真的想,你可以使用一个全局变量。下面是每种方法的示例

(您可以将我的
say
替换为您的
return


使用调用方

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();
调用者
返回一个数组,其中包含有关当前函数从何处调用的信息(行、包、函数等)。这个数组的第四个元素是调用它的函数,它的包是完全限定的,因此使用了
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();
您会注意到,我为
$f1\u标志
重命名了您的
$count
:拥有全局变量已经够糟糕的了,所以最好尝试给它们指定有效的名称。(这样,您就不必为知道这个变量的用途而费心了,而且您可能也不会想在另一个变量中重复使用相同的名称)


声明一个全局(或包)变量。然后,与其在
f2
内将其设置为
1
,然后再回到
0
f1
内,我更喜欢使用:
$f1_标志
对于
f2
动态范围内的每个函数或指令,使用全局变量通常是个坏主意,因为它们使代码更难维护(正如@choroba在评论中提到的)和编写

正如@Borodin所提到的,如果
f1
只应
返回
f2
调用的内容,否则什么也不返回,最简单的方法是让
f1
返回内容,不管它是否由
f2
调用,如果不在
f2
中,则忽略该返回值

但是,如果从
f2
调用时,
f1
需要返回一个特殊值,而从其他地方调用时需要返回其他值,则有几种可能性:您可以向
f1
传递一个参数,以识别调用它的人。或者你可以用来知道是谁打电话给
f1
。或者,如果你真的想,你可以使用一个全局变量。下面是每种方法的示例

(您可以将我的
say
替换为您的
return


使用调用方

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();
调用者
返回一个数组,其中包含有关当前函数从何处调用的信息(行、包、函数等)。这个数组的第四个元素是调用它的函数,它的包是完全限定的,因此使用了
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();
您会注意到,我为
$f1\u标志
重命名了您的
$count
:拥有全局变量已经够糟糕的了,所以最好尝试给它们指定有效的名称。(这样,您就不必为知道这个变量的用途而费心了,而且您可能也不会想在另一个变量中重复使用相同的名称)


声明一个全局(或包)变量。然后,与其在
f2
内部将其设置为
1
,然后再回到
0
内部
f1
,我更倾向于使用:
$f1\u标志
对于
f2
动态范围内的每个函数或指令都将是
1
,不清楚您想要什么。不建议使用全局变量,因为它们使代码更难维护。为什么不向函数传递一个参数?您应该始终从
f1
返回
$variable
,如果不需要,则忽略它。@Borodin如果调用方不是
f1
,则可能会返回其他内容。。。(我同意不管怎样,这是一个不寻常的设计)@Dada:他们说“如果只从f2调用f1,我希望f1返回一个变量。否则没有必要”,这意味着除非从f2调用了
f1
,否则不会返回任何值。当然,我们只能猜测,但是保存
return
语句没有任何意义,只有在生成返回值的过程中进行了大量处理,这才是一种经济。还可以选择wantarray
。不清楚您想要什么。不建议使用全局变量,因为它们使代码更难维护。为什么不向函数传递一个参数?您应该始终从
f1
返回
$variable
,如果不需要,则忽略它。@Borodin如果调用方不是
f1
,则可能会返回其他内容。。。(我同意不管怎样,这是一个不寻常的d