연산자

숫자 계산 연산자

@a = ( 1,2,3 );
$b = 3;            # = 는 같다는 뜻이 아닌 할당, 저장의 의미입니다.
                   # 즉, $b에 3이라는 값을 저장.
$b = $a;           # ...
$b = @a;           # 일반변수 $b에 배열 @a의 요소수(3)를 저장.
$b = "@a";         # 일반변수 $b에 배열 @a를 저장. 배열  $a의 모든요소
                   # 들이 하나의 공백을 사이에 두고 순서대로 연결되어
                   # 저장.
@b = @a;           # 배열 @b에 배열 @a를 저장. 배열  $a의 모든요소
                   # 들이 그대로 @b에 저장됨.
%b = %a;           # hash %b에 hash %a를 저장.
$b = $a = 3;       # $a, $b에 3을 저장.

   ### 위의 식들을 직접 실험해 보세요. 어떤 결과가 나오는지 직접
   ### 체크해 보시기 바랍니다.

$a = 10 + 3;  # 10과 3을 더하여 $a에 저장.
$a = 3 - 10;  # 3에서 10을 뺀 후 $a에 저장.
$a = 3 * 10;  # 곱하기.
$a = 3 / 10;  # 3 나누기 10.
$a = 2 ** 3;  # 2의 3승 (8). 주의: -2**3은 -(2**3)과 같음.
$a = 10 % 3;  # 10을 3으로 나눈 후의 나머지 값. ($a는 1).
$b = ++$a;    # $a 값을 1 만큼 증가 시킨 후에 그 값을 $b에 저장.
$b = --$a;    # $a 값을 1 만큼 감소 시킨 후에 그 값을 $b에 저장.
$b = $a++;    # $a 값을 $b에 저장한 후에 $a값을 1 만큼 증가.
$b = $a--;    # $a 값을 $b에 저장한 후에 $a값을 1 만큼 감소.

$b += 13;     # $b의 값에 13을 더한 값을 $b에 저장.
$b -= 13;     # $b의 값에서 13을 뺀 값을 $b에 저장.
$b *= 13;     #   이하 설명 생략.
$b /= 13;     # 
$b %= 13;     # 
$b **= 13;         #


문자열 계산
$a = "hello" . "world";     # $a는 "helloworld"가 됨. 사이에 있는것은
                            # 점입니다. 일명, 쩜 !
$a = "hello" x 3;           # "hellohellohello".
$a = "hello";
$a .= " world";             # "hello world"

### 증가 연산자의 마술 !
print ++($foo = '99');      # prints '100'
print ++($foo = 'a0');      # prints 'a1'
print ++($foo = 'Az');      # prints 'Ba'
print ++($foo = 'zz');      # prints 'aaa'

### 감소 연산자(--)는 증가 연산자가 피우는 재주를 모릅니다.

논리 연산자
논리 연산자는 어떤 조건이 참인지 거짓인지 판별할 때 사용합니다. 논리적 AND ( && )는 두 조건이 모두 참일 때 전체를 참으로 결정하고, 논리적인 OR ( || )는 두 조건이 모두 거짓일 때 전체를 거짓으로 결정합니다. 핵교 댕길 때 다들 배우셨지요 ? Perl 언어에서도 0은 거짓으로 보고 그외는 참으로 봅니다. 그래서
$a = 1;
$b = 2;
$c = 0;

$d = $a && $b;# $d는 2; 참
$d = $a && $c;# $d는 0; 거짓
$d = $a || $b;# $d는 1; 참
$d = $a || $c;# $d는 1; 참
가 성립합니다.

논리 연산자 (||, &&)의 재주부리기 : || 는 앞과 뒤의 참 거짓을 바탕으로 전체적 참 거짓을 판가름하는 연산자이지만, 앞의 조건이 거짓일 때 뒤의 명령어를 실행시키는 역할도 합니다. 물론 앞의 조건이 참이면 전체가 참이므로 뒤의 명령어는 실행할 생각도 않습니다. 따라서 다음과 같은 명령이 가능합니다.

$a <= $b || ( $max = $a ); # C라면 if( a > b ) max = a; 겠지요.
편리하지 않습니까 ? 위의 예제에서는 $a가 $b보다 작거나 같지 않으면 뒤의 $max = $a가 실행됩니다.
AND 연산자 (&&) 또한 마찬가지입니다.
$a > $b && ( $max = $a );
즉, $a가 참인 경우에 뒤의 ( $max = $a )도 참인지 시험하기 위해 ( $max = $a )를 실행시키는 것입니다. 그 실행이 끝나고 난 후 전체식 $a > $b && ( $max = $a )이 참인지 거짓인지 가늠되는데 그 결과는 사용하던 안하던 여러분의 자유겠지요.
위의 예문에서 ( $max = $a )와 같이 ()를 사용한 것은 || 또는 &&이 = 보다 계산시 우선 순위가 높기 때문에 괄호를 사용하지 않고 $a > $b && $max = $a와 같이 했을 때 $a > $b && $max가 먼저 계산이 되고 나중에 = $a라는 쓰레기만 남아서 에러 메시지가 나오고 실행되지 않는것을 막기 위해서입니다.

정리해서 말하면 위의 경우처럼 사용되는 ||는 "그렇지 않으면"의 뜻이고 && 는 "그러할 경우에"의 뜻이 되는것입니다.


그 외의 연산자
,(comma) 연산자는 연속된 명령의 실행, 목록내에서는 요소간의 분리 등을 나타냅니다. 그다지 중요한 것은 아니지만 가끔은 편리할 때가 있습니다.
$a = 1, $b = 3, print "@a and @b\n";
그리고,
>, <, >=, >=    # 숫자의 비교.  if ( $a > $b ) { print "O.K."; }
==, !=, <=>     # <=>는 앞의 변수가 작으면 -1, 크면 1, 앞과 뒤의 변수가 
                # 같으면 0을 return합니다.
lt, gt, le, ge  # 문자열의 비교. "ba"는 "bb"보다 작습니다(lt).
eq, ne,  cmp    #  cmp는 숫자의 <=>와 같은  역할. az는 bb보다 작습니다.(-1)

3 | 2           #  bit계산용 OR.  00000011 | 00000010 -> 00000011 -> 3
3 & 2           #  bit계산용 AND. 00000011 & 00000010 -> 00000010 -> 2
3 ^ 2           #  bit계산용 XOR. 00000011 ^ 00000010 -> 00000001 -> 1

연산자의 우선순위
한 명령행에서 여러 종류의 연산자가 사용되었을 때, perl.exe는 연산자들의 우선 순위를 따져서 먼저 계산될 부분을 결정하여 순서대로 계산을 합니다. 예를 들어 5 + 4 * 2 의 경우 앞의 5 + 4를 먼저 계산하는 것이 아니라 뒤의 4 * 2를 먼저 계산하고 그 다음에 5 + 8을 계산하는 것이지요.
이 때 앞의 5 + 4를 먼저 계산 시키려면 ( 5 + 4 ) * 2 와 같이 괄호로 묶어 주어야만 합니다.
우선 순위가 같은 연산자 끼리는 앞의 연산자에 우선 순위가 있습니다. 어떻게 아느냐고요 ? 5 * 4 % 3 과 5 % 3 * 4를 각각 실행시켜 보십시오. 다음은 연산자 사이의 우선 순위입니다. ( perlop.htm 발췌 ) 

  • left terms and list operators (leftward)
  • left ->
  • nonassoc ++ --
  • right **
  • right ! ~ \ and unary + and -
  • left =~ !~
  • left * / % x
  • left + - .
  • left << >>
  • nonassoc named unary operators
  • nonassoc < > <= >= lt gt le ge
  • nonassoc == != <=> eq ne cmp
  • left &
  • left | ^
  • left &&
  • left ||
  • nonassoc ..
  • right ?:
  • right = += -= *= etc.
  • left , =>
  • nonassoc list operators (rightward)
  • left not
  • left and
  • left or xor 
위에 설명하지 않았던 연산자들이 많이 있죠 ? 일단은 접어 두고 가세요. 또, 연산자 not, and, or, xor는 Perl 4.x에서는 없는 것들입니다. Perl 5.x 에서 사용가능한 연산자들이지요.

또 궁금해서 도저히 못 참으시는 분 들은 PERL의 manual 페이지(영문)를 찾아 보세요.


이전 | 목록 | 다음
Comments