Saturday, April 25, 2009

ActivePerl의 Tip - package의 선언후 처리

우선 코드보터 보시죠. 다음의 코드는 파일로 저장해서 실행하는데 아무런 문제가 없습니다.
Moose의 예제입니다.

package Whitecat;
use Moose;

has name => (is => 'ro');
has age => (is => 'ro', isa => 'Int', required => 1);

1;

my $whitecat = Whitecat->new(
name => 'ねこ',
age => 30,
);
print $whitecat->name;

그런데 이 코드를 Emeditor의 매크로로 실행하기 위해
ActivePerl로 넘겨 실행하기위해 살짝 바꾸어 처리를 하면

evalperl #이하의 코드를 ActiverPerl로 실행하게 하는 명령입니다.
package Whitecat;
use Moose;

has name => (is => 'ro');
has age => (is => 'ro', isa => 'Int', required => 1);

1;

my $whitecat = Whitecat->new(
name => 'ねこ',
age => 30,
);
$window->document->writeln($whitecat->name); #window는 Emeditor에서 제공받는 객체입니다.

다음과 같은 에러가 발생합니다.

ScriptControl.ExecuteStatement Error
16389:Global symbol "$window" requires explicit package name
source:PerlScript Error

이 에러를 회피하기 위해서, Compile할 때와, 실행할 때로 나누도록 BEGIN문으로 block을 잡아주니 문제없이 실행되었습니다. 다음은 에러가 없는 전체 코드입니다.
evalperl
BEGIN {
package Whitecat;
use Moose;

has name => (is => 'ro');
has age => (is => 'ro', isa => 'Int', required => 1);

1;
}

my $whitecat = Whitecat->new(
name => 'ねこ',
age => 30,
);
$window->document->writeln($whitecat->name);

perl의 설계상 특성중 동적언어의 유연함을 잘 이용하려면, Scope라고 해야 할까요. Phase라고 해야할까요. 다음의 block을 이용해야 할 때가 있을 것 같습니다.

컴파일시 : BEGIN,
초기화시 : CHECK(역순), INIT
실행시 : 일반코드
종료시 END(역순)

No comments: