-
- 1. Symbol Table, Typeglob - aero님의 강좌
-
-
- 1.1. Symbol Table과 Identifier
-
- 1.2. Perl의 Symbol table
-
- 1.3. Symbol table에 접근하기
-
- 1.4. Symbol table의 내의 값에 접근
-
- 1.5. 레퍼런스
-
- 1.6. 타입글로브와 레퍼런스 1
-
- 1.7. 타입글로브와 레퍼런스 2
-
- 1.8. 모듈의 import
-
2. Comments
-
1. Symbol Table, Typeglob - aero님의 강좌
1.1. Symbol Table과 Identifier
Symbol table : 컴퓨터 언어에서 컴파일러가 Identifier(식별자)를 관리하는 저장장소이다.
Identifier :
- 변수,함수,서브루틴,패키지,라벨 등등의 언어를 구성하는 요소들의 이름을 말한다.
- Perl의 변수는 sigil+identifier의 결합 형태
- Perl은 sigil로 인해 같은 identifier를 가진 스칼라,배열,해시,서브루틴 등등이 가능하다.
- Perl의 Identifier는 첫 문자는 알파벳 대소문자와 _만 가능하며(숫자는 안됨) 나머지는 공백없이 알파벳 대소문자,숫자,_가 나올 수 있고 251자 까지로 제한
- $a, $_b, $c1, $a_b, @_a_b, %a_, $_a_ ,@c__
1.2. Perl의 Symbol table
- Perl은 패키지마다 각자의 심볼테이블을 가진다.(유사해시 구조)
- 패키지를 지정하지 않으면 기본으로 main패키지이다.
- my로 선언되는 렉시컬 변수와는 상관없다.(스크래치패드에 저장)
심볼테이블 심볼이름 타입 변수
main:: c SCALAR $c
ARRAY @c
HASH %c
CODE &c
IO 파일 혹은 디렉토리 핸들
GLOB *c
FORMAT 포멧이름
NAME
PACKAGE
일반적인 프로그램에서 스칼라 변수 $c를 선언(패키지 변수)했다면, main:: 이라는 심볼테이블의 c라는 심볼이름 내에 SCALAR 타입에 그 값이 들어가게 된다.
1.3. Symbol table에 접근하기
main 패키지의 심볼 덤프하기
> perl -e 'print join,"\n", keys %main::'
심볼생성 확인
> perl -e 'print join "\n", keys %main::' | grep abc
없음
> perl -e '$abc=1;print join "\n", keys %main::' | grep abc
abc
있음
1.4. Symbol table의 내의 값에 접근
Symbol table 접근은 심볼이름(identfier)앞에 "*"가 붙은 Typeglob를 통해서 한다.
*main::c
*main::c{SCALAR}
*main::c{ARRAY}
*c
*c{SCALAR}
*c{ARRAY}
$c = 2;
print $c, "\n";
print $main::c, "\n";
print ${*main::c{SCALAR}}, "\n";
print ${*c{SCALAR}}, "\n";
print ${*main::c}, "\n";
print ${*c}, "\n";
모두 2가 찍힘
레퍼런스의 종류
$c=5;
$sym = "c";
$ref = \$c;
print ${$sym},$$sym,"\n";
print ${$ref},$$ref,"\n";
- 레퍼런스는 스칼라 값이다.
- 심볼릭레퍼런스는 use strict 프래그마 하에서는 못쓴다.
$c=5;
@c=(1,2);
$sr = \$c;
$ar = \@c;
print ${$sr},$$sr,"\n";
print @{$ar},@$ar,"\n";
1.6. 타입글로브와 레퍼런스 1
#!/usr/bin/perl
use strict;
our $c=5;
our @c=(1,2);
our ($d,@d);
our ($e,@e);
*d=*c;
*e=*c{SCALAR};
print "$d\n";
print "@d\n";
print "$e\n";
print "@e\n";
1.7. 타입글로브와 레퍼런스 2
#!/usr/bin/perl
use strict;
our $c=5;
our @c=(1,2);
our ($ref1,$ref2);
$ref1 = *c;
print "$$ref1 @$ref1\n";
$ref2 = \$c;
print "$$ref2\n";
1.8. 모듈의 import
/모듈을 use 하면 모듈의 코드를 require하는 과정과 import하는 과정이 동시에 일어나게 된다. 이 import 과정에서 심볼테이블과 타입글로브가 쓰인다.
package My;
use strict;
use warnings;
sub import {
my $caller = caller();
{
no strict 'refs';
*{$caller."::hello"} = *hello;
}
}
sub hello {
print "hello\n";
}
1;
- *{$caller."::hello"} 라는 형태는 심볼릭 레퍼런스를 쓰는 것이기 때문에, no strict 'refs'가 필요하다
#!/usr/bin/perl
use strict;
use warnings;
use My;
My::hello();
hello();
2. Comments
컴퓨터분류