nTree
가치가 있다고 생각되는 만큼 과감하게 자신의 노력과 근성을 투자하라. 나무의 크기와 열매는 그 다음이다.
Branches :     소개 선우 그녀 편지 주저리 Apple CS Perl FBP Arduino erinPaper
 
Perl - rss link

*nix를 오래도록 사용해 왔더라도 perl을 얼마나 알고 있느냐 라는 질문에 정확하게 답하기가 어려울 것만 같다. 그래서 든 생각인데, 처음부터 다시 공부하는 마음으로 아주 기초적인 것부터 천천히 하나씩 기록해 보면 어떨 까? 하는 생각을 하게 되었다. 자주 update되지는 않겠지만 일단 시작했으니 끝을 보도록 하자. 글 목록이 궁금하다면 "Index"
 

2012.05.17 - 21:54:30

 

Reference #3 - two-dimensional array with reference

 

Perl은 1차원 배열(one-dimensional array)만 존재한다. 그래서 2차원 이상의 배열을 사용하려면 스스로 만들어내야한다. 여기서 2차원 배열(two-dimensional array)을 만들어 보도록 하자.
 

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

my @numbers= ( [  1,  2,  3,  4,  5 ],
               [ 11, 12, 13, 14, 15 ],
               [ 21, 22, 23, 24, 25 ],
               [ 31, 32, 33, 34, 35 ],
               [ 41, 42, 43, 44, 45 ],
               [ 51, 52, 53, 54, 55 ] );

print $numbers[4][1], "\n";
위와 같은 방법으로 표현해서 만들어낼 수 있으며, 사용할 수 있다.
물론 2차원 배열은 각 행이 하나의 reference로 이루어졌기 때문에 아래와 같은 표현이 가능하다.
$row1= $numbers[1];
 

앞에서 array를 설명할 때 reference 하는 방법 뿐만 아니라 dereferencing하는 방법을 소개했다. 이해가 가지 않는다면 다시 유심히 들여다 보도록 하자.!
 

 

2012.03.21 - 17:30:52

 

Reference #2 - for array variable and data

 

기본적으로 scalar variable을 다뤘던 것과 동일하게 다음과 같은 표현으로 array도 reference할 수 있다.

$ref= \@numbers;
array reference는 '[', ']'를 사용하여 생성할 수도 있다. 또한 '@'을 사용하여 dereferencing 가능하다. 추가적으로 $$ref[5]와 $ref->[5]는 동일한 의미를 갖는 표현이다.
 

아래의 code에서 4, 5번째 라인의 code는 주석으로 붙여놓은 2줄과 맞교환 가능한 표현이라 할 수 있다.

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

my $ref= [ 0 .. 10 ];    # @numbers= ( 0 .. 10 );
my @numbers= @$ref;      # $ref= \@numbers;

my $element5= @{$ref}[5];

print $numbers[5], "\n";
print $element5, "\n";
print $$ref[5], "\n";
print $ref->[5], "\n";

$$ref[5]= 10;
$ref->[5]= 9;

print $$ref[5], "\n";
 

앞선 글(Reference #1 - intro + for scalar variable and data)에서 이야기를 꺼냈던 array에 array를 붙이려면 다음과 같은 방법을 이용하여 해결한다.

my @numbers1= ( 0 .. 10 );
my @numbers2= ( 11 .. 20 );
my $ref= \@number2;

push @numbers1, $ref;
다만 이 방법은 numbers1의 element로서 array reference를 포함시킨 것이지, array가 포함된 것이 아님을 기억해야한다. 그렇기 때문에 아래와 같은 표현으로는 의도한 결과를 볼 수가 없다.
print @numbers1;
아래와 같이 출력될 뿐임을 기억해야한다.
012345678910ARRAY(0x7fba8b834998)
다음과 같이 수정하면 우리가 원하는 결과를 얻을 수 있다.
push @numbers1, @$ref;
print @numbers1;
 

 

2012.02.12 - 22:10:52

 

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를 기억하라.
 

<<   1  2 3 4 5 6   >>
 
rss feed / created by yuki.n.pl