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

时间:2012-12-30 02:28:17

标签: perl scope mason

我正在写一个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行)

相同的代码在非梅森语境中工作正常。

3 个答案:

答案 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