【发布时间】:2021-12-13 02:12:42
【问题描述】:
在我的软件开发课程中,我被分配了这样一个问题。因此,通常的方法是逐个检查每个过程并记住每个子程序的每个调用,但是,我是一个有点懒的程序员,我决定走捷径,用实际的编程语言实现给定的伪代码。
问题陈述:
procedure Main is
X, Y, Z : Integer;
procedure Sub1 is
A, Y, Z : Integer;
begin
...
end;
procedure Sub2 is
A, B, Z : Integer;
begin
...
procedure Sub4 is
A, B, W : Integer;
begin
...
end;
end;
procedure Sub3 is
A, X, W : Integer;
begin
...
end;
begin
...
end;
考虑上面的程序。给定以下调用序列并假设 使用动态作用域,在最后一个子程序的执行过程中哪些变量是可见的 活性?在每个可见变量中包含声明它的单元的名称(例如 Main.X)。
- 主调用 Sub1; Sub1 调用 Sub3; Sub3 调用 Sub2;
我的尝试:
$x = 10;
$y = 20;
$z = 30;
sub Sub2
{
return $x;
}
sub Sub1
{
local $x = 9;
local $y = 19;
local $z = 29;
return Sub2();
}
print Sub1()."\n";
我被困在这一点上,不知道如何更改代码以显示变量。我看到这个解决方案很明显,但到目前为止我已经用 C++ 和 Java 编写过代码。
【问题讨论】:
-
您可以使用PadWalker 之类的东西来检查调用者中的词法变量。可以使用 Devel::Symdump 之类的方式检查包变量
-
@HåkonHægland 我真的不知道什么是 Perl 包。但我肯定会检查 PadWalker 和 Devel::Symdump。谢谢!
-
由于我们不知道最后调用的是哪个sub(因为我们懒得弄明白),所以我们需要打印所有不调用的subs中的vars其他潜艇。
-
懒惰的程序员总能找到更好的方法。但我确实找到了正确的(硬)方法。我只是对自动方式感到好奇。
-
您的讲师所说的“动态范围”与 Perl 中的含义可能不匹配。
local对全局变量的值进行局部更改。它不会影响变量的可见性(它是全局的,随处可见)。
标签: perl variables procedure pseudocode scopes