perl의 자료형은 스칼라, 배열, 해시로 이루어진다고 저번시간에 설명해드렸습니다.
이번에는 그 중 스칼라를 설명해 드리겠습니다.
스칼라 $를 앞에 붙이는 변수
perl에서 $를 앞에 붙여서 만드는 변수는 스칼라 변수인데 다른 언어에서 보면 일반적인 변수라고 생각하시면 됩니다. 이 스칼라 변수의 특징은 모든 숫자는 실수로 받아들이고 심지어 문자열도 저장한다는 것입니다. 저는 c언어를 베이스로 프로그래밍을 공부한 사람이다보니 처음에 뭐 이런게 다있지 싶었는데 이게 굉장히 강력한 것 같습니다. perl에서 변수는 스칼라, 배열, 해시 밖에 없는데 일반적인 데이터는 스칼라 변수에서 취득하니 뭐든 처리해주는 이 변수의 형태는 정말 강력하다는 생각이 듭니다.
숫자 문자열 뭐든 처리하는 강력함
$a = "1000" 도 되고 $b=1000 도 가능합니다. 여기서 $a+$b를 하면 어떻게 될까요? 다른 언어에서는 문자열을 숫자로된 데이터와 더하게 하려면 대부분 문자열을 숫자로 변환을 시켜야하거나 숫자를 문자열로 바꿔서 붙여야 합니다. 하지만 perl의 장점은 문자열로된 숫자도 그냥 숫자처럼 계산을 시킬 수 있다는 것입니다. 즉 $a+$b는 2000이 되게 되는 것입니다.
$a + $b는 2000으로 숫자로 계산을 하게 했는데요. 반대로 문자열의 처리로 10001000으로 붙이게 하고싶으면 어떻게 하면될까요? $b를 문자열로 바꿔야하는 언어들도 있지만 perl은 그럴필요가 없습니다. perl에서는 스칼라 변수를 문자열로 처리하여 두개의 문자열을 합치는 경우 . 점을 붙이면 됩니다. 즉, $a . $b이렇게 하면 됩니다. 물론 $a.$b도 됩니다.
이렇게 스칼라 변수는 숫자도 문자열도 간단히 처리해주는 강력한 형태를 가집니다. 문자열을 합치는 작업도 점 하나로 할 수 있는 것또한 perl의 장점이라고 할 수 있습니다.
perl inf과 -inf 그리고 nan
스칼라형으로 데이터를 조작한다고 했습니다만, 다른 언어들의 경우 실수형이든 정수형이든 데이터의 한계가 있고 이를 초과하면 오버플로우, 언어플로우가 발생합니다. 그런데 perl의 경우엔 이때 inf, -inf가 됩니다. inf는 infinite의 약자로 말 그대로 무한대라는 뜻입니다. -inf는 마이너스 무한대라는 뜻이 되겠죠. 그리고 nan은 NaN으로 Not a Number로 즉 숫자가 아니라는 뜻인데 0으로 나눈다거나 inf인 값에 잘못된 조작을 하는 경우 NaN의 상태가 됩니다.
지수형태 e
perl은 숫자가 일정 크기 이상이 되버리면 지수형태로 숫자를 바꿔서 출력시킵니다. 예를 들어서 1e+146이런 식으로 출력을 하는 것이죠. 보통 오버플로우가 일어나도 이상하지 않을 숫자도 어느정도 대응을 해주는 것 같습니다.
또한 숫자형태가 아닌 문자열로 저장을 시켜서 사칙연산을 시키면 일반적인 실수 데이터 보다 더 큰 값을 저장할 수 있습니다. 이건 참 대단한 것 같네요. 숫자로 저장 시켰을 때는 제 리눅스 서버의 기준으로 1e+250까지 저장이 되었는데 거기에 따옴표를 붙여서 문자열로 하니 그 이상의 데이터도 저장하고 처리를 하네요. 아무래도 버퍼의 한계가 있어서 그런걸까요?
제 리눅스 서버의 환경에서는 1e+308를 넘어가면 inf가 나옵니다. 사실 일반적으로 308자리수의 계산이 필요할 일은 없으니 어지간한 수는 다 계산이 된다고 생각하면 될 것 같습니다. 또한 이게 사칙연산으로 쓸 수도 있고 문자열로 바로 쓸 수 있다는 점이 어떻게 보면 참 매력적인 것 같습니다.
이번에 스칼라에대해 알아봤으니 다음엔 배열을 알아보도록 하겠습니다.