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

时间:2017-03-02 09:31:25

标签: perl global-variables

我会写一个伪代码

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


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

即。如果单独从f2调用f1,我希望f1返回一个变量。否则没有必要。我想用全局变量来实现这一点。你可以帮忙吗?或者还有其他方式吗? 提前完成。

1 个答案:

答案 0 :(得分:4)

使用全局变量通常是一个坏主意,因为它们使代码更难维护(如评论中的@choroba所述)并写入。

正如@Borodin所提到的,f1如果return只调用了f2,而其他任何内容都没有,最简单的方法就是让f1返回一些东西,无论是否由f2调用,如果您不在f2,则忽略该返回值。

但是,如果f1在从f2调用时需要返回一个特殊值,而在从其他地方调用时需要返回其他内容,则有几种可能性:您可以将参数传递给{{1}那可以识别谁叫它。或者您可以使用caller来了解致电f1的人。或者,如果您真的想要,可以使用全局变量。贝娄是各种方式的例子。

(您可以将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:它已经足够糟糕以获得全局变量,因此最好尝试给它们提供重要的名称。 (这样,你不必知道这个变量的用途,并且你可能不会想要为另一个变量重用相同的名称)。

our声明一个全局(或包)变量。然后,我不想将其设置为$f1_flag内的1,然后返回f2内的0,而是使用localf1对于$f1_flag的动态范围内的每个函数或指令,将为1