2

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

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

给我错误:

编译 /opt/rt4/local/plugins/RTx-Foo/html/cf/helpers/ticketQuery.ajx 时出错:变量“@myOrderBy”在 /opt/rt4/local/plugins/RTx-Foo/html 不可用/cf/helpers/ticketQuery.ajx 第 206 行。

(第206行是foreach行)

相同的代码在非 Mason 上下文中运行良好。

4

3 回答 3

8

Mason 显然将您的代码包装在一个 sub 中(就像 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;

于 2012-12-30T02:47:11.073 回答
1

您不应该在 Mason 组件中使用命名的 subs,命名空间是共享的。改用这个:

我的 $sortall = sub { ... };

于 2013-12-27T10:38:18.790 回答
-3

my变量仅在声明它们的代码块中可见。sub是不同的代码块,因此 @myOrderBy 在其中不可用。见http://www.perlmonks.org/index.pl?node_id=66677

于 2012-12-30T02:31:11.157 回答