我会写一个伪代码
f1 {
..
..
if (count==1) {
count=0;// set it back to 0
return $variable;
}
f2
{
count=1;
var2=f1(..); //
}
即。如果单独从f2调用f1,我希望f1返回一个变量。否则没有必要。我想用全局变量来实现这一点。你可以帮忙吗?或者还有其他方式吗? 提前完成。
答案 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
,而是使用local
:f1
对于$f1_flag
的动态范围内的每个函数或指令,将为1
。