날짜: 1996-03-09 | 글쓴이: 도아 | 11763 번 | 프린트 | 메일로보내기

펄을 배우자 - 제 6강 제어구조


보다 관심있는 가능성은 제어구조와 순환문을 소개할 때 발생한다. 펄은 많은 서로다른 종류의 제어문을 지원하며, 이들은 C의 제어구조와 유사한 경향이 있지만 파스칼하고도 아주 비슷해 보인다. 이제 이들 중 몇몇을 논의할 것이다. foreach 문 배열의 각 요소를 처리하거나 배열과 유사한 구조(파일의 각행과 같은)를 처리하기위해 펄은 foreach 문을 사용한다. 이것은 다음과 같은 형식으로 사용한다.
foreach $morsel (@food)		# 차례로 배열의 각 항목을 리턴하며
				# 리턴된 항목은 $morsel에 저장된다.
{
	print "$morsel\n";	# 각 항목을 출력
	print "우우~~~\n";	# 기냥
}
매번 수행되는 동작은 중괄호로 감싸여진다. 처음에는 $morsel에 배열 @food의 첫 항목의 값이 할당되며 블럭에 전달된다. 다음 번에는 두번째 항목의 값이 할당된다. 이렇게 끝까지 반복된다. 만약 @food가 비어있다면 불럭은 결코 수행되지 않는다. 조건 다음의 몇몇 문장은 참이냐 거짓이냐는 조건에 의존한다. 펄에서 "0"이 아닌 값과 공백 문자열이 아닌 것은 참으로 간주된다. 숫자 "0", 문자 "0", 공백 문자열은 거짓으로 간주된다. 다음은 숫자와 문자에대한 몇몇 조건이다.
$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는 거짓인가?
for 문 펄은 C의 for문을 흉내낸 for문을 가지고 있다. for문은 다음과 같은 형식으로 사용된다.
for (조기값; 조건; 증가분)
{
	 첫번째 동작;
	 두번째 동작;
	 기타
}
무엇보다도 먼저 초기값이 수행된다. 그리고 조건이 참인동안 블럭이 수행된다. 블럭이 수행될 때마다 증가분이 취해진다. 다음은 0~9까지의 숫자를 출력하는 순환문의 예이다.
for ($i = 0; $i < 10; ++$i)	# $i = 1로 시작
				# $i < 10 동안 반복
				# 반복전에 $i를 증가
{
	print "$i\n";
}
while과 until 문 다음은 키보드로부터 입력을 읽고 이 것이 올바른 암호일때까지 반복하는 프로그램이다.
#!/usr/local/bin/perl
print "암호: ";		# 암호요구 메시지 출력
$a = <STDIN>;			# 키보드로부터 입력을 받음
chop $a;			# 행끝의 개행문자 제거
while ($a ne "fred")		# 입력이 틀리는 동안
{
    print "죽을래, 다시 할래? ";	# 반복 요구
    $a = <STDIN>;		# 다시 입력
    chop $a;			# 개행문자 제거
}
중괄호 블럭은 입력이 암호와 같지 않은 동안 수행된다. while문은 상당히 분명하지만 여기에는 몇몇 주의해야 할 것이 있다. 먼저 파일을 열지 않고도 표준입력(키보드)으로부터 읽을 수 있다. 두번째로 암호가 입력될 때 $a는 끝에 개행문자를 포함한다. chop 함수는 문자열의 마지막 문자(이경우, 개행문자)를 제거한다. 동일한 방법에 반대의 조건으로 수행하기위해 until문을 사용한다. while문은 참인 동안 블럭을 수행하는 반면에 untill문은 표현이 참일 때까지 반복적으로 블럭을 수행한다. 또 다른 유용한 기법은 while이나 until문을 문장 블럭의 시작이 아니라 문장블럭의 끝에다 두는 것이다. 이것은 블럭의 시작을 표시하고 끝에서 조건을 검사하기위해 do 연산자를 필요로 한다. 위의 암호 프로그램에서 죽을래, 다시 할래?라는 메시지를 없애려면 소스를 다음과 같이 변경하면 된다.
#!/usr/local/bin/perl
do
{
	print "암호: ";		# 입력요청
	$a = <STDIN>;		# 입력
	chop $a;		# 개행문자 제거
}
while ($a ne "fred")		# 입력이 틀리는 동안 위 블럭을 반복
연습 앞의 연습에서 작성한 프로그램을, 한행씩 읽고, 행의 선두에 행번호를 출력하도록 변경하라. 출력은 다음과 같을 것이다:
1 root:oYpYXm/qRO6N2:0:0:Super-User:/:/bin/csh
2 sysadm:*:0:0:System V Administration:/usr/admin:/bin/sh
3 diag:*:0:996:Hardware Diagnostics:/usr/diags:/bin/csh

다음과 같은 구조를 사용하는 것이 유용하다는 것을 알게될 것이다.
while ($line = <INFO>)
{
	...
}
프로그램을 변경할 때 행 번호가 001, 002, ..., 009, 010, 011, 012와 같은 식으로 출력되도록 변경할 수 있는가 알아본다. 이 것을 하기위해서는 추가적으로 4개의 문자를 삽입하면 가능하므로 한행만 변경하면 된다.


다음글: 펄을 배우자 - 제 7강 조건문 (5954)1996-03-10
이전글: 펄을 배우자 - 제 5강 파일핸들 (11331)1996-03-08

세상사는 이야기

  • 바보도 할 수 있는 War >
  • 북마크에도 확장 아이 >
  • 크롬은 가라, 비발디가 >
  • 감히 아이폰 관리의 최 >
  • 디지털 노마드의 편집 >
  • [블로그 복귀 알림] 새 >
  • 오타도 즐거운 안드로 >
  • 최고의 OCR 어플, Text >
  • 누구나 할 수 있는 순 >
  • 듀오백 컨텐츠 허브, >


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