2012-12-30 3 views
2

Mason 1.x 구성 요소 페이지를 작성 중이며 예상 한 것처럼 작동하지 않습니다. perlsub 매뉴얼 페이지는에서 변수 my이 액세스 가능해야 함을 나타냅니다. 그러나 다음 코드를내 'my` 변수가 하위 내에서 액세스 할 수없는 이유는 무엇입니까?

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

나에게 오류를 일으켜 :

Error during compilation of /opt/rt4/local/plugins/RTx-Foo/html/cf/helpers/ticketQuery.ajx: Variable "@myOrderBy" is not available at /opt/rt4/local/plugins/RTx-Foo/html/cf/helpers/ticketQuery.ajx line 206.

동일한 코드가 아닌 메이슨 컨텍스트에서 잘 작동 (라인 (206)은 foreach 라인).

답변

8

을 참조하십시오. Mason은 분명히 코드를 서브로 랩핑합니다 (mod_perl처럼). 즉, 설명이 긴 복잡 당신이

$ perl -we'sub { my $x; sub sortAll { $x } }' 
Variable "$x" is not available at -e line 1. 

같은 끝낼 것을 의미하지만 귀결 : 펄이 중첩라는 이름의 서브 우퍼를 지원하지 않습니다. 이렇게하면 이상한 오류가 발생합니다.

이 상황에서 my $x; 대신 local our $x;을 사용하는 것이 좋습니다.

+1

또는'sub sortAll {'대신'* sortAll = sub {' – ysth

-3

my 변수는 선언 된 코드 블록 내에서만 볼 수 있습니다. sub은 다른 코드 블록이므로 @myOrderBy를 사용할 수 없습니다. http://www.perlmonks.org/index.pl?node_id=66677

+3

아니요, 사실이 아닙니다. 위에서 말했듯이 코드는 메이슨이 아닌 다른 맥락에서 작동합니다. 또한,'man perlsub'은 '라고 말합니다. 이것은 정적으로 둘러싸인 어휘 범위에서 선언 된 "my"변수가 보이지 않음을 의미하지 않습니다. 동적 범위는 입니다. 예를 들어 아래의 "bumpx()"함수는 "my"와 "sub"모두 이 동일한 범위, 아마도 파일 범위에서 발생했기 때문에 어휘 $ x 변수에 액세스 할 수 있습니다. my $ x = 10; sub bumpx {$ x ++}' –

1

Mason 구성 요소에서 명명 된 subs를 사용해서는 안되며, 네임 스페이스는 공유됩니다. 이것을 대신 사용하십시오 :

my $ sortall = sub {...};

관련 문제