본문 바로가기

Script/Perl

11. Context

영어를 쓰다보면 같은 단어라도 문맥에 따라 다르게 해석한다.
 
펄의 가장 독특한 특징은 코드가 언어처럼 문맥에 영향을 받는다는 점이다.
 
모든 펄 표현식은 결과로 스칼라를 생성할지 리스트를 생성할지에 따라
 
스칼라 문맥 또는 리스트 문맥 중 하나에서 평가된다.
 
또한 많은 펄 표현식과 내장함수(built-in-functions) 가 평가되는 문맥에 따라 아주 다르게 동작한다.
 
이를 표현식의 문맥 (the context of the expression) 이라고 한다.
 
표현식이라 함은 함수, if, while 같은 제어구조 단순 대입등 값을 변수에 넣는 모든 행위를 말한다.
 
예를 들어 sort 표현식은 스칼라 문맥에서는 아무것도 리턴할게 없기에 스칼라 변수에 대입하려 하면
 
undef 를 반환한다.
 
 
 
Scalar Context
 
$scalar 에 대입하는 대입식의 경우에 Context 는 Scalar Context 이다.
 
뭔 말이고 하니 단 하나의 유효한 값만 읽는 다는 이야기다.
 
하지만 배열식을 저장한 Variable 의 경우에는 Scalar Context 에서 배열의 길이로 평가한다. 
 
my $scalar = "a";
my $scalar2 = ("a", "b", "c");  # c 가 저장된다. # Scalar Context 에 List Expression 사용
 
my @array = ( "Alpha", "Beta" , "Gamma", "Pie" );
my $scalar = @array ;    # $scalar의 값은 배열의 길이인 4이다  # Scalar Context 에 List Expression 사용
 
 
 
List Context
 
@array = 또는 %hash =와 같은 배열 또는 해시 대입문은 표현식을 리스트 문맥에서 평가한다.
 
리스트 문맥에서 리스트 값을 평가하면 리스트가 반환되어 배열이나 해시로 들어가게 된다
 
그리고 리스트 문맥에서 스칼라 표현식이 평가되면 1개의 요소를 가진 리스트로 평가된다.
 
my @array = ( "Alpha", "Beta" , "Gamma", "Pie"); # List Context 에 List Expression 사용 
my %hash = ( "Alpha" => "Beta" , "Gamma" => "Pie");   # List Context 에 List Expression 사용
my @array = "Mendeleev"# my @array = ("Mendeleev");  # List Context 에 Scalar Expression 사용
 
print 내장 함수는 인자 모두를 리스트 문맥에서 평가한다.
 
실제로 print는 제한없는 수의 인자 리스트를 받아 각각 차례로 출력한다.
 
그래서 배열도 직접 출력하는데 이용할 수 있는 것이다.
 
scalar 내장 함수를 이용하면 어떠한 표현식이라도 스칼라 문맥에서 평가되게 할 수 있다.
 
배열의 길이를 구할 때 scalar 함수를 쓰는 것은 이를 이용한 결과이다.
 
서브루틴이 스칼라 문맥에서 실행되면 스칼라 값을 반환하고
 
리스트 문맥에서 실행되면 리스트 값을 반환하도록 작성하는데 얽매일 필요는 없다.
 
위에서 보았듯이 펄이 적절하게 값을 처리해준다.
 
 
 
Forced Scalar Context
 
강제로 scalar 문맥으로 해석하기 위해서는 scalar 라는 함수를 사용하면 된다.
 
이는 펄에게 스칼라 문맥을 제공하도록 알려주기만 할 뿐 사실 진짜 함수는 아니다.
 
 
 

'Script > Perl' 카테고리의 다른 글

13. Sub Routine  (0) 2020.01.21
12. Reference  (0) 2020.01.21
10. conditional sentence  (0) 2020.01.21
09. string  (0) 2020.01.21
08. List Data  (0) 2020.01.21