>我将编写一个伪代码
f1 {
..
..
if (count==1) {
count=0;// set it back to 0
return $variable;
}
f2
{
count=1;
var2=f1(..); //
}
如果仅从 f2 调用 f1,我希望 f1 返回一个变量。 否则不需要。我想使用全局变量来实现这一点。你能帮忙吗.还是还有其他方法? 提前感谢。
使用全局变量通常是一个坏主意,因为它们使代码更难维护和编写(如@choroba在注释中提到的)。
正如@Borodin所提到的,如果f1
应该只return
被f2
调用而没有其他东西,最简单的方法是让f1
返回一些东西,不管它是否被f2
调用,如果你不在f2
中,就忽略该返回值。
但是,如果f1
在从f2
调用时需要返回一个特殊值,而在从其他地方调用时需要返回其他值,则有几种可能性: 您可以将参数传递给f1
,以标识谁调用了它。或者你可以用caller
知道谁打电话给f1
。或者,如果您确实愿意,可以使用全局变量。波纹管是每种方式的例子。
(你可以用你的return
替换我的say
。
使用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
返回一个数组,其中包含有关从何处调用当前函数的信息(行、包、函数等)。该数组的第 4 个元素是调用它的函数,对其包完全限定,因此使用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_flag
重命名了你的$count
:拥有全局变量已经够糟糕的了,所以最好尝试给它们起重要的名字。(这样,您就不必费力地知道这个变量的用途,并且您可能不会试图为另一个变量重复使用相同的名称)。
our
声明全局(或包)变量。然后,与其将其设置为1
内部f2
,然后再设置回0
内部f1
,我更喜欢使用local
:$f1_flag
将1
用于f2
动态范围内的每个函数或指令。