perl - 为什么我的 `my` 变量不能在 sub 中访问?

标签 perl scope mason

我正在编写一个 Mason 1.x 组件页面,但它的行为并不像我期望的那样。 perlsub 手册页指出 my 变量应该可以在 sub 中访问。但是下面的代码:

my @myOrderBy = @orderBy;
sub sortAll
{
  my $ret = 0;
  foreach my $sortStr (@myOrderBy)
  {
  }
}

给我错误:

Error during compilation of /opt/rt4/local/plugins/RTx-Foo/html/cf/helpers/ticketQuery.ajx: Variable "@myOrderBy" is not available at /opt/rt4/local/plugins/RTx-Foo/html/cf/helpers/ticketQuery.ajx line 206.

(第 206 行是 foreach 行)

相同的代码在非 Mason 上下文中工作正常。

最佳答案

Mason 显然将您的代码包装在一个子程序中(就像 mod_perl 那样)。这意味着你最终会得到类似的东西

$ perl -we'sub { my $x; sub sortAll { $x } }'
Variable "$x" is not available at -e line 1.

解释很复杂,但归结为:Perl 不支持嵌套的命名子程序。尝试这样做会导致奇怪的错误。

在这种情况下,我是否建议您使用 local our $x; 而不是 my $x;

关于perl - 为什么我的 `my` 变量不能在 sub 中访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14087779/

相关文章:

perl - 让 Perl 将完整的 "key path"打印到值中(Data::Dumper 不会)

java - 为什么不能将方法的局部变量声明为final?

perl - 在 perl mason 中,.m 文件和 .mi 文件有什么区别?

perl - 如何使Mason2 UTF-8干净?

regex - 在哪里可以找到 Perl 的集合正则表达式练习?

perl - 在 Windows 上以 unicode 名称打开文件夹中的文件

java - 全局消息处理器与本地消息处理器

perl - 在 Mason 中打印参数内容

Perl 的 Unicode::UCD::charscript 函数无法识别我的字符

javascript - 从 forEach 回调中修改外部数组变量