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

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

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 앞에 $를 붙임으로써 가능해진다. 따라서 위 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를 기억하라.
 

 

2012.02.06 - 13:45:45

 

undef, use warnings

 

각 변수에 대한 설명이 끝나면, 매번 잠시 다른 이야기를 하곤했다. 이번에도 그렇다. 다만 간단하면서 중요하다.
 

scalar, array, hash variable은 값을 미리 지정해주지 않아도 사용이 가능하다. 기본적으로 'undef'의 값이 주어진다. 'undef'는 아무런 값도 가지고 있지 않다는 이야기이다. 따라서 해당 변수의 값은 0이나 empty string 이 아니다. 그런데 해당 변수의 값을 읽으면 기본적으로 empty string, 0을 제공하다.
 

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

my $undefVar;
print "Undefined variable: $undefVar", "\n";
print "Undefined variable + 5 = ", $undefVar + 5, "\n";
Undefined variable:
Undefined variable + 5 = 0
위와 같이 아무런 값을 가지지 않은 $undefVar는 계산이 필요하여 해당 값을 읽어내야 하는 상황이 오자 원래 가진 값이 '0'인양 동작했다.  

가급적 초기화되지 않는 변수를 그냥 가져다 쓰는 것은 좋지 못하다. 이런 것을 확인하기 위해서는 use strict과 비슷한 use warnings를 선언해 줌으로써 해결해 줄 수 있다. use warnings는 변수 이름이라던가 선언되지 않는 사용, reference의 잘못된 사용(나중에 이야기할 것임), filehandle(나중에 이야기할 것임), 기타 등등 code상에 문제가 있을 때 경고를 해주는 것이다. 따라서 위 code에 use warnings를 추가한 아래의 code는 실행하면 그 아래의 결과를 얻는다.

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

my $undefVar;
print "Undefined variable: $undefVar", "\n";
print "Undefined variable + 5 = ", $undefVar + 5, "\n";
s:~ yuki.n.pl$ ./1.pl 
Use of uninitialized value $undefVar in concatenation (.) or string at ./1.pl li
ne 6.
Undefined variable: 
Use of uninitialized value $undefVar in addition (+) at ./1.pl line 7.
Undefined variable + 5 = 5
 

마지막으로 keyword 'undef'를 사용하게 되면 해당 변수의 값을 undef 상태로 만들 수 있습니다.

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

my $var= 3;
undef $var;

print "$var", "\n";
print "$var + 5 = ", $var + 5, "\n";
s:~ yuki.n.pl$ ./1.pl 
Use of uninitialized value $var in string at ./1.pl line 8.

Use of uninitialized value $var in concatenation (.) or string at ./1.pl line 9.
Use of uninitialized value $var in addition (+) at ./1.pl line 9.
 + 5 = 5
 

 

2012.01.31 - 16:49:21

 

Hash Variable

 

이번에 다뤄볼 변수는 Hash 다. perl에서는 Hash를 기본 타입으로 가지고 있다.
Hash는 기본적으로는 탐색을 위하여 고안되었다고 해도 과언이 아닐만큼 탐색에 뛰어난 능력을 가지고 있다. 여기서 Array와의 차이점을 가지고 온다. Array는 기본적으로 Index가 정수로 이루어진다. 따라서 Array의 경우 특정 Data를 찾기 위해서 Data를 순차적으로 찾는 방법 밖에 없다. 물론 Binary Search와 같이 O(log n)안에 탐색 가능하기도 하다. 그러나 Hash는 O(1)의 탐색을 가능하게 한다. 왜냐하면 Hash는 Array와 동일하게 Data에 접근하기 위해 Index가 존재하지만 이 Index가 정수가 아닌 'Symbol'. 바꿔말하면 string을 Index로 사용할 수 있다.
 

예를 들어보면 이렇게 이야기할 수 있다. 학생들의 키를 어떻게 데이터로 보관할 것인 가? 를 생각해보도록 하자. Array에다가 학생들의 키를 저장해 두는 경우에는 해당 키가 누구의 키인지 알 수가 없다. Index와 학생번호를 동일하게 생각하고 입력해둔다고 하면 또 다시 학생의 이름을 확인해야하는 문제가 생긴다. 그러나 Hash의 경우는 조금 다르다. Index 자체를 학생의 이름으로 해둘 수 있기 때문이다. 이런 경우 특정 학생의 키를 검색해야할 때 바로 확인할 수 있게 된다. 아래의 code를 보면서 이해해보도록 하자

#!/usr/bin/perl
use strict;

my %height= ("Robert" => "164", "Albert" => "155", "William" => "182");

print $height{"Robert"}, "\n";
print $height{"Albert"}, "\n";
print $height{"William"}, "\n";
163
155
182
Hash는 variable name 앞에 '%'를 붙인다. 그리고 각 Index에 대한 값에 접근할 때, $variableName{"key"} 와 같은 방식으로 가능하다.
 

Hash의 경우에는 아무래도 'key'[1]가 중요할 수 밖에 없다. 특정 값을 찾일 때 'key'를 통해서 찾기 때문이다. 바꿔말하면 'key'만 알면 찾을 수 있고 반대로 'key'를 모르면 찾을 수 없다는 이야기가 된다.
perl에서는 hash variable에서 key 값만 array variable으로 받을 수 있는 방법을 제공한다. 아래의 code를 보면 쉽게 이해할 수 있으리라 생각된다.

#!/usr/bin/perl
use strict;

my %height= ("Robert" => "164", "Albert" => "155", "William" => "182");
my @keys= keys %height;
print "@keys", "\n";
Albert William Robert
 

마지막으로 위 code를 보면서 이해했겠지만 Hash에서의 값의 순서는 의미가 없다.
 

[1] Hash에서는 Array에서의 Index를 일반적으로 Key라고 부른다.
 

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