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를 수행한다.
예
펄은 C의 for문을 흉내낸 for문을 가지고 있다. for문은 다음과 같은 형식으로 사용된다.
for ($i = 0; $i < 10; ++$i){ # $i = 1로 시작
# $i < 10 동안 반복
# 반복전에 $i를 증가
print "$i\n";
}
제일먼저 먼저 초기값($i = 0)이 수행된다. 그리고 조건($i < 10)이 참인동안 블럭이 수행된다. 블럭(print "$i\n";)이 수행며, 이때마다 증가분(++$i)이 취해진다. 따라서 위의 예는 0~9까지의 숫자를 출력하는 순환문의 예이다.
while과 until 문사용형식
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"); # 입력이 틀리는 동안 위 블럭을 반복