为什么我的`my`变量不能在子内部访问?

Pau*_*lin 2 perl scope mason

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

my @myOrderBy = @orderBy;
sub sortAll
{
  my $ret = 0;
  foreach my $sortStr (@myOrderBy)
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

给我错误:

编译/opt/rt4/local/plugins/RTx-Foo/html/cf/helpers/ticketQuery.ajx时出错:/ opt/rt4/local/plugins/RTx-Foo/html中没有变量"@myOrderBy" /cf/helpers/ticketQuery.ajx第206行.

(第206行是该foreach行)

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

ike*_*ami 8

Mason显然将你的代码包装在一个sub中(比如mod_perl).这意味着你最终得到类似的东西

$ perl -we'sub { my $x; sub sortAll { $x } }'
Variable "$x" is not available at -e line 1.
Run Code Online (Sandbox Code Playgroud)

解释很长很复杂,但归结为:Perl不支持嵌套的命名subs.试图这样做会导致奇怪的错误.

我建议你使用local our $x;而不是my $x;在这种情况下吗?