(1) if ~ else 구문

 

[형식1]

if ( 조건 )

{

             조건에 따른 처리;

}

else

{

             조건에 따른 처리;

}

 

[형식2]

if ( 조건 )

{

             조건에 따른 처리;

}

elsif ( 조건 )

{

             조건에 따른 처리;

}

else

{

             조건에 따른 처리;

}

 

if ~ else 구문은 어떤 조건을 만족하는지를 검사하고 만족할 때는 if 구문 바로 아래에 있는 문장이 실행되고 만족하지 않을 때에는 else 구문을 수행한다. else 구문은 생략할 수 있으며 [형식2]에서 처럼 if ~ else를 반복해서 사용할 수도 있다. if 구문 다음에 else if를 함께 사용할 때는 elseif가 아니고 elsif인 점을 주의하기 바란다. 그리고 elsif if else 구문 사이에 있어야 한다.

 

Perl에서의 if 구문은 C if 구문과 비슷하다. 하지만 주의할 점은 Perl에서는 조건에 따른 처리 문장이 한 줄일 경우에도 { }를 사용해야 한다는 것이다.

 

[예제 6.7.1]

$a=5;

if ($a < 5)

{

             print 5보다 작다.\n;

}

else

{

             print 5보다 크거나 같다.\n;

}

[실행 결과]

5보다 크거나 같다.


앞의 예제에서 $a 5라는 값이 들어가 있고 if 문에서 $a 5보다 작은지를 검사한다. $a 5보다 작지 않기 때문에 if 구문이 수행되지 않고 else 구문이 수행되므로 5보다 크거나 같다.라는 문장이 출력된다.

 

if 문은 다음과 같이도 사용할 수 있다.

 

$a=5  if ($a < 5);

 

간단한 조건일 경우에는 위와 같은 방식으로 하면 간단하게 작성할 수 있다.


 

(2) unless 구문

 

[형식]

unless ( 조건 )

{

             조건에 따른 처리;

}

 

 

unless 구문은 if와 반대되는 말이라고 생각하면 된다. if는 어떤 조건이 참일 때 수행하는 것이지만 unless는 거짓일 때 수행된다.

 

unless (1 == 2)

{

             print Its wrong\n;

}

 

앞의 예를 보면 조건에서 1 2는 같지 않기 때문에 거짓이 된다. 거짓이면 블록 안의 내용을 수행하므로 Its wrong 이라는 결과가 출력된다.

 

if 문과 마찬가지로 unless도 다음과 같이 줄여서 사용할 수 있다.

 

$a = 1 unless $a;

 

위의 예는 $a에 값이 없을 경우에 1을 대입하라는 문장이다.

 

 

(3) while

 

[형식]

while (조건)

{

             조건에 따른 처리;

}

 while 문은 조건이 참일 경우에 블록 안의 내용을 반복해서 수행한다. 즉 조건이 참이면 블록 안의 내용을 순서대로 수행하고 다시 while 문이 있는 조건으로 돌아가서 다시 조건이 참인지 검사를 한다. 조건이 참일 경우에는 다시 불록의 내용을 수행하고 거짓이라면 수행을 중단하게 된다.

 

[예제 6.7.2]

$i=1;

$sum=0;

while ($i <= 10)

{

             $sum+=$i;

print $i : $sum\n;

}

print Sum : $sum\n;

 

 

[실행 결]

1 : 1

2 : 3

3 : 6

4 : 10

5 : 15

6 : 21

7 : 28

8 : 36

9 : 45

10 : 55

Sum : 55

 

앞의 예제는 1부터 10까지 1씩 증가하면서 값을 더하는데 각 단계별로 중간 합계를 보여주는 소스이다. while ($i <= 10)에서 $i는 처음에는 1이기 때문에 참이 되어 블록의 내용을 수행하고 다시 조건으로 돌아오면 $i 2가 되어있다. 여전히 10보다 작아서 참이 되므로 계속 반복하다가 $i 10일 때 마지막 결과를 출력하고 $i 11이 되면 조건을 만족하지 못해서 더 이상 블록의 내용을 수행하지 않고 while 문을 빠져나가게 된다.

 

 

(4) until

 

[형식]

until (조건)

{

             조건에 따른 처리;

}

 

until while과 반대로 조건을 만족할 때까지 수행하게 된다. 즉 조건이 거짓일 때 수행을 한다. if unless의 경우를 비교해 보면 이해가 쉽게 될 것이다.

 

(5) for

 

[형식]

for (초기값 설정; 끝나는 조건; 반복처리;)

{

             조건에 따른 처리;

}

 

for 문의 조건은 세 부분으로 이루어 진다. 첫 번째는 초기에 설정할 구문을 적는다. 두 번째는 for 문의 수행할 조건을 검사한다. 참일 경우에 블록의 내용을 수행하고 거짓이면 중단한다. 세 번째는 for 루프(loop)가 반복될 때마다 수행되는 구문이다. 예를 들어보자.

 

[예제 6.7.3]

$sum=0;

for ($i=1; $i <= 10; $i++)

{

             $sum+=$i;

print $i : $sum\n;

}

print Sum : $sum\n;

[실행 결]

1 : 1

2 : 3

3 : 6

4 : 10

5 : 15

6 : 21

7 : 28

8 : 36

9 : 45

10 : 55

Sum : 55

 

금방 눈치 챘을지도 모르지만 앞의 예제 결과는 while 문에서 보았던 예제와 결과가 같다. while 문을 이용한 소스를 for 문으로 바꾼 것이다. 하나씩 따라가 보자. 일단 for 문에 도착하면 $i=1;이 수행된다. 그리고 $i <= 10; 조건을 검사한다. 조건을 만족하기 때문에 블록 안으로 들어가 수행을 한다. 수행을 마치면 $i++;이 수행된다. $i 1이 증가하여 2가 되었고 다시 $i <= 10 조건을 검사한다. 여전히 만족하므로 블록의 내용이 계속 수행된다. $i 11이 되면 더 이상 조건을 만족하지 않기 때문에 블록을 수행하지 않고 밖으로 빠져나가 마지막 print 문을 실행하게 된다.

때에 따라서는 while 문을 사용하는 것 보다 for를 사용하는 것이 더 유용할 때가 있다. 개발할 때에 어느것이 적절한지 판단하여 사용하기를 바란다.

 

 

for 문을 다음과 같이 사용할 수도 있다.

 

             for ($i=1, $sum=0; $i <= 10; $i++)

 

각 조건을 입력할 때는 콤마(,)를 이용해서 여러 가지를 나열할 수도 있다. 그러나 너무 많은 조건을 나열하면 소스가 복잡하여 별로 보기 좋지 않으니 적절히 사용하는 것이 좋다.

 

(6) foreach

 

[형식]

foreach  로컬 변수(리스트)

{

             조건에 따른 처리;

}

루프를 이용하여 리스트에 저장된 요소에 대해 점검한다. foreach에 대한 수행 방법은 다음의 두 가지 예를 통해서 비교해 볼 수 있다.

 

[예제 6.7.4]

@list=(1,2,3,4,5);

 

$i=0;

$list_size=@list;

 

while ($i < $list_size)

{

print "$list[$i]\n";

$i++;

}

[예제 6.7.5]

@list=(1,2,3,4,5);

 

foreach $i (@list)

{

print "$i\n";

}

 

[실행 결]

1

2

3

4

5

 

앞의 두 가지 예제의 결과는 같다. 그런데 두 번째 예제 소스를 보면 첫 번째 예제 소스보다 훨씬 간단하다. 이런 점이 foreach의 편리함이라고 할 수 있다. 실행되는 과정을 살펴보면 우선 @list에는 1부터 5까지의 5개의 숫자가 들어있다. foreach $i (@list) @list에서 각 요소의 값을 하나씩 꺼내서 $i에 저장한 다음에 블록 안의 내용을 수행하는 것이다. 수행은 @list의 모든 요소를 하나씩 다 꺼내서 사용하게 되므로 @list의 크기 만큼 수행하는 것이다.

여기서 $i는 로컬 변수로 foreach 문이 수행되는 동안에만 유효한 변수이다. foreach 문 이전에 $i를 사용하고 있었더라도 foreach 문 수행 후에 기존의 $I 값은 영향을 미치지 않는다.

 


(7) do

 

[형식]

do {

             조건에 따른 처리;

} while (조건)

또는

 

} until (조건)

 

지금까지 나왔던 루프 프로그램에서는 루프를 실행하기 전에 조건식을 먼저 판별하였다. 그러나 do 문을 사용하게 되면 일단 블록 안의 내용을 먼저 실행하고 조건을 판별하게 된다.

 

[예제 6.7.6]

$i=1;

do {

print $i\n;

$i++;

} while ($i <= 10);

 

[실행 ]

1

2

3

4

5

6

7

8

9

10

일단 처음에는 아무런 조건 없이 블록의 내용을 수행한다. $i는 처음에 1이었다가 한 번 수행이 되고 2가 되었다. 수행이 완료되면 while 문에서 $i <= 10 조건을 만나서 만족하는지 여부를 판단한다. 조건을 만족하므로 다시 블록의 내용의 수행을 반복하다가 $i 11이 되면 수행이 끝나고 while 문에서 조건을 만족하지 못하므로 수행을 중단한다.


 

(8) last

 

[형식]

last;

 

일반적으로 루프를 빠져 나오려면 처음이나 끝부분에 있는 조건문으로 판별하여 만족하지 못할 때 루프를 빠져 나오게 된다. 그러나 필요에 따라서 루프 수행 도중에 빠져 나와야 할 상황이 있을 수 있다. 이럴 때는 last 명령을 사용한다. 루프 안에서 last 명령을 사용하면 더 이상 조건을 비교하지 않고 강제로 루프를 빠져 나오게 된다.

 

[예제 6.7.7]

for ($i=1, $sum=0; $i <= 10; $i++)

{

             $sum+=$i;

             if ($sum > 20)

             {

                           print Current Sum : $sum\n;

                           last;

             }

}

 

[실행 결]

Current Sum : 21

 

앞의 예제를 살펴보면 1부터 10까지의 합계를 구하는 도중에 합계가 20이 넘어가면 중단을 하고 합계를 출력하는 프로그램이다. 루프 안의 조건에서 $sum > 20을 만족하는 시점에 결과를 출력하고 last 명령으로 루프를 종료했다. last 명령을 만나면 더 이상 조건을 판별하거나 블록 안의 내용을 수행하지 않게 되고 무조건 루프 밖으로 빠져 나가게 된다.

 


(9) next

 

[형식]

next;

 

last는 루프의 실행을 중지시키는 명령이다. 그러나 next를 사용하면 실행중인 루프를 중단하고 다음 루프로 건너 뛸 수 있다.

 

[예제 6.7.8]

for ($i=1; $i <= 10; $i++)

{

             if ($i % 2 == 1)                  # 홀수일 때

             {

                           next;

             }

             print $i\n;

}

[실행 결과]

2

4

6

8

10

 

앞의 예는 1부터 10까지의 정수 중에서 짝수만 출력하는 프로그램이다. for 문에서는 1부터 10까지 10번의 루프를 돌게 되어 있고, 그 값을 출력하게 되어 있다. 루프에 들어가면 if 문에서 $i를 나머지 연산자 %를 사용하여 2로 나누어 본다. 2로 나누어서 나머지가 1이면 홀수이기 때문에 next 문을 사용해서 숫자를 출력하지 않고 다음 루프로 넘어가게 된다. next 문은 주로 루프에서 예외 사항 같은 경우에 적용할 수 있다.

 

 


(1)
산술 연산자

 

기본적으로 +, -, *, /의 사칙 연산자를 지원하고 누승 연산자(**), 나머지 연산자(%), 단항 부정 연산자 등이 있다.

 

$result1 = 4 ** 3;

$result2 = 26 % 3;

-$y;

 

누승 연산자는 첫 번째 줄에서와 같이 $result1에는 4 3번 곱한다는 뜻이다. 64가 된다.

나머지 연산자는 두 번째 줄에서와 같이 $result2에는 26 3으로 나누고 난 나머지 값이 저장되며 값은 2가 된다.

단항 부정 연산자는 숫자나 변수 앞에 을 붙여서 사용한다. 이 의미는 해당 값에 1을 곱한 것과 같다.

 

(2) 비교 연산자

 

Perl은 문자열 비교 연산자와 수치 비교 연산자가 다르다. 다음의 내용은 수치 비교 연산자와 문자열 비교 연산자를 정리한 것이다.

 

연산

문자열 연산자

수치 연산자

보다 작다

lt

< 

보다 크다

gt

> 

같다

eq

=

보다 작거나 같다

le

<=

보다 크거나 같다

ge

>=

같이 않다

ne

!=

비교 후 1,0,-1을 반환

cmp

<=>

 

Perl에서는 변수에 문자열과 숫자를 구분하지 않고 저장되기 때문에 비교 연산자를 사용할 때는 정확히 사용해야 한다. 다음의 예를 살펴보자.

 

$num1=123;

$num2=45;

$result1=$num1 < $num2;

$result2=$num1 lt $num2;

 

앞의 예에서 $num1 $num2에는 각각 123 45라는 값이 저장되어 있다. 여기서 $result1에서는 <을 사용하여 수치 비교를 했고, $result2에서는 lt를 사용하여 문자열 비교를 했다. $result1 123 < 45가 되기 때문에 참이 된다. 그러나 $result2에서는 123 lt 45가 되므로 거짓이 된다. 문자열에서는 12345 보다 작기 때문이다. 참고로 문자열의 비교는 각 자리 별로 아스키 코드를 기준으로 비교를 한다. 같은 값을 가지고 비교를 했지만 다른 연산자에 따라 다르게 결과가 나오기 때문에 문자열과 숫자 비교는 정확히 사용해야 한다.

 

(3) 대입 연산자

 

기본적인 대입 연산자는 = 이다. $a = $b의 형식으로 왼쪽의 값을 오른쪽에 대입하는 것이다. 그러나 다음과 같은 다양한 연산자를 활용하면 다양한 연산을 할 수 있다.

 

연산자

수행결과

$a = 5

$a 5를 대입

$a += 5

$a의 값에 5를 더해서 $a에 대입

$a -= 5

$a의 값에서 5를 빼서 $a에 대입

$a *= 5

$a의 값에 5를 곱해서 $a에 대입

$a /= 5

$a의 값을 5로 나눠서 $a에 대입

$a %=5

$a의 값을 5로 나눈 나머지를 $a에 대입

$a **= 5

$a의 값을 5번 곱해서 $a에 대입

$a .= end

$a의 문자열에 end라는 문자열을 붙여서 $a에 대입

 

(4) 논리 연산자

 

논리 연산자는 어떤 조건이 참인지 거짓인지 판별할 때 사용한다. AND 연산자 &&는 각 조건을 모두 만족할 때 참이 되고 OR 연산자 ||는 어느 한 조건만 만족하면 참이 된다.

 

$a=1;

$b=2;

$result1 = ($a > 0) && ($b < 2);

$result2 = ($a > 1) || ($b < 3);

 

앞의 예를 보면 $result1에서는 $a > 0이 참이고 $b < 2가 거짓이므로 결과는 거짓이 된다. $result2에서는 $a > 1이 거짓이지만 $b < 3이 참이기 때문에 결과는 참이 된다.

 

 

(5) 자동 증가와 자동 감소 연산자

 

$num = $num + 1;

$num += 1;

 

앞의 예는 변수에 1을 더하는 방법이다. 여기에는 다음과 같은 방법이 또 있다.

 

$num++;

++$num;

 

이 방법은 모두 $num 1을 더하는 연산이다. 차이점은 $num++이 어떤 문장 속에서 사용 되었을 때 해당 라인이 수행되고 나서 값이 증가하는 반면 ++$num은 값이 증가한 후에 라인이 수행된다. 자세한 예로 다음을 살펴보자.

 

$num1=5;

$num2=5;

$result1 = $num1++;                       # $result1=5   $num1=6

$result2 = ++$num2;                       # $result2=6   $num2=6

 

$num1 $num2에는 5라는 값이 들어있다. 그리고 $result1에는 $num1의 값이 대입되고 나서 $num1 1 증가 시키게 된다. 그래서 $result1에는 5가 들어가고 $num1 6이 된다. 그러나 $result2에서는 $num2의 값이 먼저 1 증가하고 나서 $result2에 값이 저장되므로 $result2 6이 되고 $num2 6이 된다.

 

자동 감소 연산자는 ++ 대신 --을 사용한 것이고 사용하는 방식은 같다.

 

 

(6) 문자열 연결과 반복 연산자

 

문자열 연결 연산자는 두개의 문자열을 하나로 합치는 것이다. .을 사용하며 다음의 예를 살펴보자.

 

$string = Perl . Book;

 

앞에서 Perl이라는 문자열과 Book이라는 문자열을 그대로 붙여서 $string에는 PerlBook 이라는 값이 저장된다. 변수를 사용해도 같은 값을 얻는다.

 

$string1 = Perl;

$string2 = Book;

$string = $string1 . $string2;

 

앞의 경우도 결과는 마찬가지로 PerlBook 이 된다. 이 때 . 연산을 해도 $string1 $string2에는 아무런 영향이 없다.

 

문자열 반복은 문자열을 여러 번 반복한 다음에 이들을 합치며 x 를 사용한다.

 

$string = a x 5;

 

앞의 문장은 a 5번 반복해서 하나로 합친 결과를 $string에 저장하게 되므로 aaaaa  저장된다. 이 연산에서도 마찬가지로 변수를 지정해서 사용할 수 있다.

 


문자열 반복 연산자를 사용할 때는 연산자 양쪽에 있는 변수나 값 사이에 공백을 주어야 한다. 연산자인 x가 문자이기 때문에 공백이 없을 경우에는 변수와 붙어서 다른 변수로 인식할 수도 있기 때문이다. 다음의 예를 살펴보자.

 

$string = $text x 5;            # 맞다

$stinrg = $textx 5;             # 틀리다

$string = $text x5;             # 틀리다

 

두 번째 줄에는 $text x가 붙어서 $textx라는 변수인 것처럼 보인다. 이럴 경우 에러가 발생하게 된다.


 기본적인 웹의 형태는 서버에 있는 HTML과 이미지 등을 클라이언트쪽으로 전달해 주는 일방적인 방식이다. 이런 일방적인 방식에서 좀더 발전해서 서버와 클라이언트에서 서로 주고 받는 양방향의 서비스를 가능하게 하는 것이 CGI이다.

CGI(Common Gateway Interface)란 간단하게 말하면 서버에서 작동하는 프로그램이라고 말할 수 있다. 서버에서 어떤 기능을 수행한 뒤에 결과를 일정한 형태로(, HTML) 클라이언트쪽으로 넘겨주면 클라이언트의 브라우저에서 이 결과를 보여주게 된다.

사용자 삽입 이미지

<그림> CGI 작동 방식 개요



위의그림은 CGI의 작동 방식을 간략하게 나타내고 있다. 클라이언트(사용자)가 사이트에 접속하여 어떤 값을 넘겨주었을 때 웹 서버는 이 값을 받아서 해당 프로그램을 실행시킨다. 프로그램이 수행된 결과가 웹 서버쪽으로 넘어가고, 이 결과를 클라이언트의 화면에 나타나게 된다.  CGI는 웹 프로그램의 기본 개념으로 보면 된다.

+ Recent posts