我在写一个Mason。x组件页,它的行为不像我所期望的。perlsub手册页指出,my
变量应该可以在sub
中访问。但是下面的代码:
my @myOrderBy = @orderBy;
sub sortAll
{
my $ret = 0;
foreach my $sortStr (@myOrderBy)
{
}
}
给了我错误:
编译时出现错误/opt/rt4/地方/插件/RTx-Foo/html/cf/帮助/ticketQuery.ajx:变量"@myOrderBy"在/opt/rt4/地方/插件/RTx-Foo/html/cf/帮助/ticketQuery.ajx第206行。
(第206行是foreach
行)
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;
。
您不应该在Mason组件中使用命名子,命名空间是共享的。用这个代替:
my $sortall = sub{…};
my
变量仅在声明它们的代码块中可见。sub
是一个不同的代码块,因此@myOrderBy在其中不可用。见http://www.perlmonks.org/index.pl?node_id=66677