我正在写一个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
行)
相同的代码在非梅森语境中工作正常。
答案 0 :(得分:8)
Mason显然将你的代码包装在一个sub中(比如mod_perl)。这意味着你最终会得到像
这样的东西$ perl -we'sub { my $x; sub sortAll { $x } }'
Variable "$x" is not available at -e line 1.
解释很复杂,但归结为:Perl不支持嵌套的命名subs。试图这样做会导致奇怪的错误。
我建议您在这种情况下使用local our $x;
代替my $x;
吗?
答案 1 :(得分:1)
你不应该在Mason组件中使用命名subs,命名空间是共享的。请改用:
我的$ sortall = sub {...};
答案 2 :(得分:-3)
my
变量仅在它们声明的代码块中可见。sub
是一个不同的代码块,因此@myOrderBy不可用。见http://www.perlmonks.org/index.pl?node_id=66677