Reference #1 - Intro + for scalar variable and data

 

#!/usr/bin/env perl
use strict;
use warnings;

@arrayUpperLetters= ( 'A' ... 'Z');
@arrayLowerLetters= ( 'a' ... 'z');
$arrayUpperLetters[26]= @arrayLowerLetters;

print "$arrayUpperLetters[26]", "\n";
위 code의 의도는 @arrayUpperLetters에 @arrayLowerLetters의 elements들을 추가하려는 것이다. 그러나 Perl에서 Array variable을 또 다른 Array variable의 elements 중 하나에 담으려고하면 해당 Array의 size(length)가 담기게 된다. Array variable의 elements는 반드시 Scalar Data여야 하기 때문이다. 따라서 위 code는 26이 출력되게 된다.
 

기본적으로 Perl은 Array variable에 또다른 Array variable을 포함시킬 수 없다. 그러나 Programmer가 이러한 방법을 원할 수 있을 것이며, 이것을 실현할 수 있는 방법이 Reference이다. Reference는 기본적으로 다른 Variable 또는 Data struct를 Scalar type의 형태로 가르킬 수 있다. 따라서 Reference는 Array나 Hash에 관계없이 위와 같은 문제를 실현할 수 있게된다. C/C++을 다루어봤다면 유사한 것으로 Pointer를 들 수 있을 것이다.
 

my $string= "Good day";
my $ref= \$string;
Scalar variable '$ref'가 $string의 Reference 다. Reference를 만들어내기 위해서는 Variable 앞에 '\'(backslash)[1]를 표기해주면 된다. 따라서 '$ref'는 '$string'을 가르키고 있다. 지금부터 Reference가 어떻게 사용되는지 이해가 쉽도록 code를 들어가며 설명하도록 할 것이다.
print $$ref;
Reference가 현재 가르키고 있는 Data 또는 Variable의 값을 사용하려면 위와 같이 Reference variable 앞에 $를 붙임으로써 가능해진다. 이 것을 Dereferencing이라고 한다. 위 code의 결과는 다음과 같다.
Good day
 

아래 code를 제대로 이해하고 있다면 일단 Reference의 기본을 이해했다고 볼 수 있다. 아래 code의 결과를 예상해보도록 하자.

#!/usr/bin/env perl
use strict;
use warnings;

my $string= "Good day";
my $ref= \$string;

$string= "Blue day";
print $$ref;             # same with ${$ref}
결과가 예상되는 가? 스스로 code를 옮겨쓰고 실행해 보도록하자. 물론 아래의 code도 동일한 결과를 가져온다.
$!/usr/bin/env perl
use strict;
use warnings;

my $string= "Good day";
my $ref= \$string;
$$ref= "Blue day";

print $string;
 

글을 거의 다 써 갈때쯤 'n군'이 이런 질문을 했다. Reference를 print를 사용해서 그대로 출력하면 어떻게 되느냐? 해 보면 되는 것 아닌 가? 아래와 같이 출력될 것이다.[2]

SCALAR(0x10082a3b8);
 

다음 글에서 이 글의 처음 code를 reference를 이용하여 programmer가 기존에 의도한대로 처리할 수 있도록 하는 방법에 대한 설명을 할 것이다.
 

[1] backslash는 때에 따라 화면에 Won/Yen등을 나타내는 단위의 표시로 나타날 수 있다.
[2] 출력된 값은 다를 수 있다. 위와 같은 형식으로 출력될 것이다. 가르키고 있는 Data나 Variable에 따라서 출력되는 값은 매번 달라질 수 있다. C/C++를 사용해봤다면 Pointer를 기억하라.