Perl 제어 구조
Perl control structuresPerl의 기본 제어 구조는 C 및 Java에서 사용되는 것과 유사하지만 여러 가지 방법으로 확장되었습니다.
루프
다음 예제에서 label은 콜론으로 끝나는 옵션 식별자이며 block은 여러 Perl 문의 시퀀스 중 하나로 중괄호로 둘러싸여 있습니다.C-style을 제외한 모든 루프 구성for
-루프에는continue
루프 본문을 반복할 때마다 루프 조건이 다시 평가되기 전에 실행되는 블록입니다.
( expr1 ; expr2 ; expr3) 블록의 라벨
이것은 이른바 C스타일입니다.for
loop. 첫 번째 식은 첫 번째 루프 반복 전에 평가됩니다.두 번째 식은 반복 전에 평가되며 false로 평가되면 루프가 종료됩니다.세 번째 식은 반복 후 다음 수행 여부를 결정하기 전에 평가됩니다.이것.for
loop은 루핑 구성체 중 유일하게,continue
expr3은 기능적으로는 동등합니다.
label for var ( list ) block continue block label for var ( list )block continue block label for var ( list )block continue block
인foreach
, var는 스칼라 변수입니다.기본값은$_
생략할 경우리스트의 각 요소에 대해서, var는 요소에 에일리어스 되어 루프 본체가 1회 실행된다.키워드for
그리고.foreach
는 동의어이며 항상 교환할 수 있습니다.
label while ( expr ) block label ( expr ) block continue label ( expr ) block continue block ( expr ) block continue block
그while
loop은 제어식이 참인 한 루프 본문을 반복적으로 실행합니다.이 상태는 루프 본문 전에 평가됩니다. until
는 비슷하지만 조건이 false인 한 루프 본문을 실행합니다.
라벨. 블록 라벨. 블록 계속하다. 블록
라벨 블록의 구성은 조금 이상합니다.Perl은 라벨 유무에 관계없이 베어 블록을 한 번 실행되는 루프로 취급합니다.즉, loop control 키워드를 사용하여 블록을 재시작하거나 조기에 종료할 수 있습니다.또한 베어블록에는continue
차단합니다.
루프 제어 키워드
Perl에는 모두 옵션의 루프라벨을 인수로 받아들이는3개의 루프제어 키워드가 준비되어 있습니다.라벨이 지정되지 않은 경우 키워드는 가장 안쪽 루프에 작용합니다.네스트 루프 내에서 라벨을 사용하면 내부 루프에서 외부 루프 또는 외부 루프에서 모두 이동할 수 있습니다.loop control 키워드는 Perl에서는 C나 Java와 같은 문장이 아니라 식으로 취급됩니다.
- 그
next
키워드는 루프의 현재 반복 끝에 직접 점프합니다.이로 인해 보통 루프의 다음 반복이 시작되지만continue
먼저 블록 및 루프 상태를 평가합니다. - 그
last
키워드는 라벨에 의해 식별된 루프의 실행을 즉시 종료합니다.그continue
블록은 실행되지 않습니다. - 그
redo
키워드를 지정하면 라벨에 의해 식별된 루프의 현재 반복이 재시작됩니다.어느 쪽도continue
블록도 루프 조건도 평가됩니다.
조건문
if ( expr ) block if ( expr ) block elsif ( expr ) block ...else block ( expr ) block elsif ( expr ) block elsif ( expr ) block elsif ( expr ) block ...을 제외하고 else blockelse 블록
여기서 block은 중괄호로 둘러싸인 여러 Perl 문의 시퀀스입니다.
제어식은 부울 컨텍스트에서 평가됩니다.숫자 값 0, 문자열 "" 및 "0" 및 정의되지 않은 값undef
false, 다른 값은 모두 true입니다.즉, 숫자 컨텍스트에서는 값이 0으로 변환되지만 문자열 "0.0", "00", "-0" 및 "0 but true"는 모두 true임을 의미합니다.이러한 값은 정상적인 조작으로0을 반환해야 할 때 사용되는 경우가 있습니다.
스칼라 컨텍스트에서 빈 배열을 평가하면 수율이 높아집니다.undef
거짓입니다.따라서 다음 예제에서는 "a is empty"가 출력됩니다.
나의 @a=(); ''그렇지 않으면'' (@a) { ''인쇄'' "a가 비어 있습니다." }
문의 수식자
또한 Perl은 블록 대신 단순한 스테이트먼트(부작용에 대해 평가된 표현식)로 동작하는 루프 및 조건부 컨스트럭트의 배리언트도 제공합니다.
expr인 경우 statement, expr인 경우 statement, expr인 경우 statement, expr인 경우 statement, list인 경우 statement foreach list;
그while
그리고.until
수식자는 루프 표현과 마찬가지로 문을 실행하기 전에 제어 표현을 테스트합니다.단, 실제 루프로 간주되지 않기 때문에 loop control 키워드는next
,last
그리고.redo
사용할 수 없습니다.이 명령어는 다음 명령어와 조합하면 특별한 의미가 있습니다.do
키워드:
expr 동안 차단하고 expr까지 차단합니다;
이러한 구성에서는 블록이 실행된 후 조건이 테스트되므로 블록은 항상 최소 1회 이상 실행됩니다.
이러한 수식자는 중첩될 수 없으므로 다음이 잘못되었습니다.
statement if expression for list; #ERROR
다음 중 하나로 작성해야 합니다.
( expression ) 및 ( statement )의 경우 목록, ( list )의 경우 { statement if expression }이(가) { statement if expression } foreach list;
에 가다
Perl에는 다음 두 가지 형식의 goto가 있습니다.
고토라벨
그리고.
goto & subroutine(서브루틴)
첫 번째 형식은 일반적으로 권장되지 않으며 드문 경우에만 사용됩니다.예를 들어 에러 상태를 유지하려고 할 때$?
일부 모듈은 다음과 같이 goto를 사용합니다.
열다.(A, "<", $파일라) 또는 에 가다 실패하다; 열다.(B ,">", $fileb) 또는 에 가다 실패하다; 인쇄물 B <A> 또는 에 가다 실패하다; 가까운. A 또는 에 가다 실패하다; 가까운. B 또는 에 가다 실패하다; 돌아가다 1; 실패: $reason(이유) = "복사본: $?"; 돌아가다 0;
두 번째 형식은 테일콜이라고 불리며 Perl의 기본 스택 관리가 비최적적으로 실행되는 특정 종류의 컨스트럭트의 성능을 향상시키기 위해 사용됩니다.예를 들어 다음과 같습니다.
후보선수 요인 { 나의 n달러 = 교대하다; 나의 합계 $ = 교대하다(@_) 1; 한다면 (n달러 > 1) { @_ = (n달러-1,합계 $*n달러); 에 가다 &요인; } 또 다른 { 돌아가다 합계 $; } }
이 형식은 최소한의 오버헤드로 서브루틴 에일리어스를 작성하는 경우에도 사용됩니다.이를 통해 동일한 서브루틴을 반복할 때 자주 볼 수 있는 "메모리 부족" 오류(또는 일반적으로 메모리 사용량이 높음)를 줄일 수 있습니다.