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



>我将编写一个伪代码

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

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

如果仅从 f2 调用 f1,我希望 f1 返回一个变量。 否则不需要。我想使用全局变量来实现这一点。你能帮忙吗.还是还有其他方法? 提前感谢。

使用全局变量通常是一个坏主意,因为它们使代码更难维护和编写(如@choroba在注释中提到的)。

正如@Borodin所提到的,如果f1应该只returnf2调用而没有其他东西,最简单的方法是让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_flag1用于f2动态范围内的每个函数或指令。

相关内容

  • 没有找到相关文章