在 Perl 中,变量可以具有 词法 或 动态 作用域。
my 创建具有 词法作用域 的变量:变量仅在定义它的块内可见。local 临时重新定义全局(包)变量的值,具有 动态作用域:新值在所有被调用的函数中可见,直到退出块。our 定义全局(包)变量,但仅在当前词法块中可见。示例:
our $x = 10; sub test_my { my $x = 20; inner(); } sub test_loc { local $x = 30; inner(); } sub inner { print $x; } test_my(); # 输出 10 — my $x 在 inner 中不可见 $| = 1; test_loc(); # 输出 30 — local $x 在 inner 中可见
local 用于修改特殊的包变量类型,如 $_、$/、@$ 等。
执行以下代码的结果会是什么?为什么?
our $a = 5; sub outer { my $a = 10; inner(); } sub inner { print $a; } outer();
答案:输出 5。因为来自 outer 的 my 变量 $a 在 inner 中不可见;使用的是通过 our 声明的包变量 $a。
故事
故事
故事
在 JavaScript 开发后转向 Perl 的过程中,开发者习惯性地到处声明变量为 our,尽管没有必要,这导致出现意外的全局变量,妨碍了封装并导致命名冲突。