신기한 단항 덧셈 연산자 (+)
파일 크기를 알아내는 법에 대한 기사에 say (stat $filename)[7];이라는 코드가 있었습니다. 이 코드는 처음 생각했던 대로 동작하지 않았고, 그 문제를 해결하는 방법 중 하나는 괄호 앞에 +를 붙여서 say +(stat $filename)[7];와 같이 사용하는 것이었습니다.
여기서 + 부호가 정확히 하는 일이 무엇인지 어느 독자분이 질문을 주셨습니다.
문서에 있는 설명으로는 + 부호는 print 함수를 괄호 (로부터 분리하고, 펄로 하여금 이 괄호가 print 함수의 매개변수를 둘러싼 용도로 쓰인 게 아니라는 것을 알려준다고 합니다.
이 정도로 충분할지도 모르지만, 더 알고 싶다면 B::Deparse 모듈을 사용하여 펄이 이 코드를 어떻게 받아들이는지를 살펴볼 수 있습니다.
print +(stat $filename)[7];
저 내용을 plus.pl 파일로 저장한 후 perl -MO=Deparse plus.pl라고 실행합니다. 그 결과는 다음과 같은 출력과
print((stat $filename)[7]);
그 아래 다음 출력이 나옵니다.
files/plus.pl syntax OK
보다시피 + 부호는 사라졌고, 그 대신 괄호쌍이 추가되었습니다. 이 추가된 괄호는 print 함수의 매개변수를 둘러싸는 괄호입니다.
say와 함께 쓰일 경우
print 함수의 경우를 보았으니, 이번에는 plus.pl 파일에서 print 대신에 say를 써 보겠습니다.
say +(stat $filename)[7];
perl -MO=Deparse plus.pl를 실행하면 결과가 이렇게 나옵니다:
'say' + (stat $filename)[7];
아니???
뜻밖의 결과를 보고, 이게 무슨 뜻인지 몰라 잠시 어리둥절합니다. 그러나 잠시 후에 say는 펄에 기본적으로 있는 게 아니라는 게 기억이 납니다. say 함수를 사용하겠다고 어떤 식으로든 미리 알려주어야 합니다. 예를 들면 use 5.010;라고 적습니다.
따라서 코드는 다음과 같이 바뀌고:
use 5.010; say +(stat $filename)[7];
perl -MO=Deparse files/plus.pl를 실행하면 이제 다음과 같은 결과가 나옵니다.
sub BEGIN { require 5.01; } no feature; use feature ':5.10'; say((stat $filename)[7]);
코드가 많아졌지만, 적어도 say의 매개변수를 둘러싼 괄호는 제대로 추가되었습니다.
결론
B::Deparse 모듈은 펄이 어떤 코드를 어떻게 해석하는지 알고 싶을 때 유용합니다.
B::Deparse에 대한 다른 글들도 읽어보세요.
Published on 2015-01-16