날짜: 1996-04-15 | 글쓴이: 도아 | 5842 번 | 프린트 | 메일로보내기

제 15강 - 제어구조


보다 관심있는 가능성은 제어구조와 순환문을 소개할 때 발생한다. 펄은 많은 서로다른 종류의 제어문을 지원하며, 이들은 C의 제어구조와 유사한 경향이 있지만 파스칼하고도 아주 비슷해 보인다. 이제 이들 중 몇몇을 논의할 것이다. foreach 문 사용형식

foreach( SCALAR) (LIST) {
	STATEMENTS;
}
SCALAR
LIST의 다음 요소를 할당받아 블록내에서 사용되는 변수. 생략되면 $_를 사용.
LIST
블록내에서 참조할 스칼라 변수 목록
next, last를 이용해서 제어 순서를 변경할 수 있으며, 중괄호는 생략할 수 없다.
설명

배열의 각 요소를 처리하거나 배열과 유사한 구조(파일의 각행과 같은)를 처리하기위해 펄은 foreach 문을 사용한다. 이것은 다음과 같은 형식으로 사용된다.

foreach $morsel (@food){	# 차례로 배열의 각 항목을 리턴하며
				# 리턴된 항목은 $morsel에 저장된다.
    print "$morsel\n";		# 각 항목을 출력
    print "우우~~~\n";		# 기냥
}

매번 수행되는 동작은 중괄호로 감싸여진다. 처음에는 $morsel에 배열 @food의 첫 항목의 값이 할당되며 블럭에 전달된다. 다음 번에는 두번째 항목의 값이 할당된다. 이렇게 끝까지 반복된다. 만약 @food가 비어있다면 블럭은 결코 수행되지 않는다.

예) env.pl

print "현재 설정된 환경변수 목록입니다.\n";

foreach $key (keys %ENV) {
	print "$key = $ENV{$key}\n";
}
조건 비교연산자

문자열 설 명 숫 자
eq 같음 ==
ne 같지않음 !=
gt 보다 큼 >
ge 보다 크거나 같음 >=
lt 보다 작음 <
le 보다 작거나 같음 <=
cmp -1,0,1을 리턴 <=>

비교 연산자는 잘못 사용한다 하더라도 어떠한 "문법"오류를 발생하지 않는다. 따라서 비교 연산자를 사용할 때에는 반드시 비교하려는 대상이 문자인지 숫자인지 확인해야 한다.

비교연산의 결과는 항상 참과 거짓이다. 펄에서는 "0"이 아닌 값과 공백 문자열이 아닌 것은 참으로 간주된다. 숫자 "0", 문자 "0", 공백 문자열은 거짓으로 간주된다. 다음은 펄에서 참과 거짓의 예이다.

####  참의 몇몇 예: 
1;		# 전통적인 참
("a","b");	# 리스트가 요소를 갖는 경우 
" ";		# 공백은 참이다.
"hello";	# 문자열은 참이다. 
"00";		# 문자열
#### 거짓의 여러 표현:
0;		# 전통적인 거짓
();		# 빈 리스트 
"";		# 널 문자열 
"0";		# 문자열 "0"
논리연산자

논리연산자를 사용해서 비교연산을 수행하는 것도 가능하다. 펄에서 사용가능한 논리연산자는 다음과 같다.

연산자 기 호 설 명
A and B A && B A와 B가 참이면 참
A or B A || B A, B 중 하나가 참이면 참
not A !A A가 참이면 거짓, 거짓이면 참

$a == $b        # $a는 $b와 같은가(숫자)?
		# 주의: = 연산자가 아니다.
$a != $b        # $a는 $b와 같지 않은가(숫자)?
$a eq $b        # I$a은 $b와 같은가(문자)?
$a ne $b        # I$a은 $b와 같지 않은가(문자)?

또한 논리 AND, OR, NOT도 사용할 수 있다:

($a && $b)	# $a와 $b가 참인가?
($a || $b)	# $a나 $b중 하나가 참인가?
!($a)		# $a는 거짓인가?
논리연산자의 새로운 용법

Perl을 포함해서 비교적 최근에 등장한 언어는 논리연산자를 Short Circuit(단락회로)로 판정한다. "(조건식1) || (조건식2)"에서 (조건식1)이 참이면 전체의 조건은 무조건 참이되므로 (조건식2)는 평가할 필요가 없다. 즉, (조건1)이 참이면 (조건2)는 실행되지 않으며, (조건식1)이 거짓일때에만 (조건식2)가 실행된다.

open(F, "$file") || die "Error: $!";

위의 문장은 $file을 열수 없으면 오류메시지를 출력하고 프로그램을 종료하는 die 문을 수행하게된다.

AND 연산자(&&)도 OR 연산자와 마찬가지 방법으로 평가된다.

-d $filename && die "$filename ...";

위의 문장은 $filename이 디렉토리 이면 die 문을 수행하게된다. 따라서 위의 문장은 다음 문장과 완전히 동일한 문장이된다.

if( -d $filename ){
	die "$filename은 디렉토리입니다.\n"; 
}

예) cat.pl

 1: $filename = $ARGV[0];
 2:
 3: -d $filename && die "$filename은 디렉토리입니다.\n";
 4: -e $filename || die "$filename이 존재하지 않습니다.\n";
 5: -T $filename || die "$filename은 텍스트 파일이 아닙니다.\n";
 6:
 7: open(F, $filename) || die "$filename을 열 수 없습니다.\n";
 8: @lines = <F>; 
 9: close(F);
10: print @lines;
조건연산자 사용형식

(조건) ? do1 : do2
설명

조건연산자는 c에서와 동일하게 동작한다. 즉, 조건이 참이면 do1을 실행하고, 조건이 거짓이면 do2를 수행한다.

다음은 0에서 9에서 홀수면 odd를 짝수면 even을 출력하는 프로그램이다.

1:  for (0..9) {
2:  	$_ % 2 == 0 ? print "$_ = even\n" : print "$_ = odd\n";
3:  }
for 문 사용형식

for ( INITIAL_EXPR ; COND_EXPR ; LOOP_EXPR ) { 
	STATEMENTS; 
} 
INITIAL_EXPR
블록에 전달될 변수를 초기화한다.
COND_EXPR
STATEMENTS를 수행한 후, INITIAL_EXPR에서 초기화한 변수가 조건에 맞는지를 검사한다.
LOOP_EXPR
STATEMENTS를 수행한 후 초기값에대해 취해지는 연산을 정의한다.
STATEMENTS
블록내에서 수행될 문장.
next, last를 이용해서 제어 순서를 변경할 수 있으며, 중괄호는 생략할 수 없다.

for(LIST) {
	STATEMENTS;
}
LIST
LIST의 각각의 요소는 시스템 변수 $_를 통해 블록으로 전달된다.
STATEMENTS
블록내에서 수행될 문장.

for(0..1) {			for(@arr, 'Jae-Geun, Kim', 33, 'age'){
	print "순환문: $_\n";		print "순환문: $_\n";
}				}
설명

펄은 C의 for문을 흉내낸 for문을 가지고 있다. for문은 다음과 같은 형식으로 사용된다.

for ($i = 0; $i < 10; ++$i){    # $i = 1로 시작
                # $i &lt; 10 동안 반복
                # 반복전에 $i를 증가
    print "$i\n";
}

제일먼저 먼저 초기값($i = 0)이 수행된다. 그리고 조건($i < 10)이 참인동안 블럭이 수행된다. 블럭(print "$i\n";)이 수행며, 이때마다 증가분(++$i)이 취해진다. 따라서 위의 예는 0~9까지의 숫자를 출력하는 순환문의 예이다. while과 until 문 사용형식

while ( EXPRESSION ) { 		untill( EXPRESSION ) {
	STATEMENTS; 			STATEMENTS; 
} 				}
EXPRESSION
블록을 수행할 조건이나 표현식. 비교연산자외에 조건연산자도 가능하다.
STATEMENTS
블록내에서 수행될 문장.
DO가 생략되어 있는 문장이며, 조건이 거짓인 경우 순환문을 결코 수행되지 않는다.

do {
	STATEMENTS;
} while (EXPRESSION);
EXPRESSION
블록을 수행할 조건이나 표현식. 비교연산자외에 조건연산자도 가능하다.
STATEMENTS
블록내에서 수행될 문장.
조건이 거짓일지라도 한번은 수행된다.
설명

다음은 키보드로부터 입력을 읽고 이 것이 올바른 암호일때까지 반복하는 프로그램이다.

 1: #!/usr/local/bin/perl
 2: print "암호: ";		# 암호요구 메시지 출력
 3: $a = <STDIN>;		# 키보드로부터 입력을 받음
 4: chop $a;			# 행끝의 개행문자 제거
 5: while ($a ne "fred")	# 입력이 틀리는 동안
 6: {
 7:     print "죽을래, 다시 할래? ";	# 반복 요구
 8:     $a = <STDIN>;	# 다시 입력
 9:     chop $a;	# 개행문자 제거
10: }

중괄호 블럭은 입력이 암호와 같지 않은 동안 수행된다. while문은 상당히 분명하지만 여기에는 몇몇 주의해야 할 것이 있다. 먼저 파일을 열지 않고도 표준입력(키보드)으로부터 읽을 수 있다. 두번째로 암호가 입력될 때 $a는 끝에는 개행문자가 포함된다. chop 함수는 문자열의 마지막 문자(이경우, 개행문자)를 제거한다.

동일한 방법에 반대의 조건으로 수행하기위해 until문을 사용한다. while문은 참인 동안 블럭을 수행하는 반면에 untill문은 표현이 참일 때까지 반복적으로 블럭을 수행한다.

또 다른 유용한 기법은 while이나 until문을 문장 블럭의 시작이 아니라 문장블럭의 끝에다 두는 것이다. 이것은 블럭의 시작을 표시하고 끝에서 조건을 검사하기위해 do 연산자를 필요로 한다. 위의 암호 프로그램에서 "죽을래, 다시 할래?"라는 메시지를 없애려면 소스를 다음과 같이 변경하면 된다.

#!/usr/local/bin/perl
do{
    print "암호: ";	# 입력요청
    $a = <STDIN>;	# 입력
    chop $a;		# 개행문자 제거
}while ($a ne "fred");	# 입력이 틀리는 동안 위 블럭을 반복
next, last 문 last

이 것은 마지막 문장을 선언하는 것이다. 즉, 조건이 아직 참이라고 할지라도 순환문 끝까지 모든 문장을 무시하고 순환문을 종료한다.

# 10까지 세는 방법
$number = 0; 
while(1) { 
	$number++; 
	if ($number >= 10 )  { 
		last; 
	}
}
next

순환문을 다시 반복한다.

# 1~10중에서 짝수만 출력
for(1..10){ 
	if ($_ % 2 == 0 )  {
		print "$_은 짝수입니다\n" 
	}else{
		next;
	}
}


다음글: 제 16강 - 조건문 (6538)1996-04-16
이전글: 제 14강 - CGI의 출력 (7448)1996-04-14

세상사는 이야기

  • 찾아라! 아이폰 순정용 >
  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2017 QAOS.com All rights reserved.