DATA 전문가로 가는 길

[Perl] Dereference 란? 본문

Programming/Perl

[Perl] Dereference 란?

EstenPark 2009. 3. 26. 02:46


세미나에서 hOney님이 발표 하신 Intermediate Perl에서 가장 골치 아팠던 Dereference에 대해서 집중적으로 확인해보겠습니다. 문제에 대한 해답은 여러 방법으로 만들 수 있습니다. perl에서 reference, dereference 할 때는 [sigil]{}연산자를 사용합니다.

연산자의 우선순위 일부분

연산자                결합성             해설
->                         좌                메소드 읽어내, Dereference

연산자는 dereference의 기능을 $연산자보다 더 직관적으로 제시합니다. ->연산자를 이용한 1차원 배열의 원소를 dereference하고, '배열의 배열'내의 원소를 dereference하는 방법도 있습니다.

use strict;
use warnings;

my $arrayref=["one","two","three","four",[10,20,30,40]];

print "$arrayref \n";
어떤 결과가 나올까?  친절한 Perl씨는 ARRAY(0x81340d8) 어떤 배열의 원소를 사용하는지 보여주는 것 같습니다.

print
"${$arrayref}[0] \n";
$arrayref 안의 one을 가져오려면 해당값은 scalar이므로 sigil은 $가 되고 ${$arrayref}[0] 이 됩니다.( @array의 첫번째 요소를 나타낼때 $array[0] 이렇게 하는걸 상기 )

print "${${$arrayref}[4]}[0]";
이제 더 복잡한 익명배열,혹은 레퍼런스를 포함한 자료구조로 가서 위에서 @arrayref안의 익명배열 [10,20,30,40,50]에서 10 을 가져오려면 어떻게 해야 할까요?
일단 @array안의 5번째 요소(여기서는 익명배열레퍼런스)를 가져와야 합니다.
레퍼런스 자체는 scalar이므로 sigil로는 $을 사용해야 하겠죠? 따라서 ${$arrayref}[4] 가 익명배열의 레퍼런스가 될겁니다. 이제 이것을 또 dereference해야하고 dereference후 최종적으로 가져올 10이 scalar이니깐 sigil은 $가 사용됩니다.

따라서 ${${$arrayref}[4]}[0]; 이렇게 하면 10을 가져옵니다.

print "$arrayref->[4][1] \n";
위와 같은 형태는 각 규칙에 의해 이루어 진다고 볼수 있습니다.
[sigil]()는 -> 대체 가능 하기때문 입니다.

${${$arrayref}[4]}[0]
${$arrayref}[4]->[0
$arrayref -> [4]->[0
$arrayref ->[4][0]

마치 2차원 배열 같기도 합니다."[4][0]"


규칙 
 
1. reference, dereference 할 때는 [sigil]{}연산자를 사용
( sigil은 최종적으로 만들어질 타입, reference는 scalar값이다. )

2. [sigil]{} 에서 {}는 생략 가능
( 단 생략할때는 연산자 우선순위에 따른 해석 순서에 문제가 없어야 함 )

3. [sigil]{}은 ->로 대체 가능
( 여러 개 일 때 [],{}들 사이의 ->는 편의 상 생략이 가능 )

- aero -


use strict;
use warnings;
 
my $ref = [1,2,3 => [4,{5=> [7,8,{9=>10}]}]];
문제 : 10을 출력 하세요.

print "$ref \n";
ARRAY(0x815a1b0) 지금까지는 그렇게 생각 될 겁니다.

print "${$ref}[0] \n";
1
위에서 말씀 드린 규칙에 따라 "1"을 잘 가지고 왔지만 원하는 답은 10입니다. 그럼 또 확인


print "${${$ref}[3]}[0] \n";
4
네 최종적으로 봤을 때 [3][?]라고 생각 해도 나쁘지 않습니다. 그렇지만 다음 부분을 보면 그 이해는 조금 다를 수 있습니다.


print "${${$ref}[3]}[1]{5}[0] \n";
7
해쉬 라고 생각하고 해쉬에 배열에 있는 원소를 가지고 왔습니다. 즉, 배열+해쉬+배열 Perl은 참 재미있는 친구입니다.

print "${${$ref}[3]}[1]{5}[2]{9} \n";
10
답이 나왔네요. 해쉬에서 배열을 통해 9에 대한 해쉬를 풀었더니 10에 대한 결과를 얻을 수 있었습니다.

print "$ref->[3][1]{5}[2]{9} \n";
10
위에서 말한 것처럼  각 규칙에 의해 이루어 진다고 볼 수 있습니다.
[sigil]()는 -> 대체 가능 하기 때문 입니다.


참고 자료
================================================================================
             사이트                                                      이름
================================================================================
http://aero.springnote.com/pages/994276                                    (aero님)
http://honeyperl.tistory.com/entry/YASPS-발표자료                      (허니님)
http://www.perlmania.or.kr:9000/trac/wiki/LearningPerl/Hashes    (perlmania)
http://doc.perl.kr/twiki/bin/view/Wiki/HowToStartPerl                   (펄덕펄덕)
http://j2k.naver.com/j2k_frame.php/korean/www.rfs.jp/sb/perl/    (일본-perl강좌)
================================================================================











Comments