Perl에서 루프를 끊으려면 어떻게해야합니까?


295

루프 break에서 명령문 을 사용하려고하는데 forPerl 코드에서 엄격한 서브를 사용하고 있기 때문에 오류가 발생합니다.

./final.pl 라인 154에서 "strict subs"를 사용하는 동안 Bareword "break"는 사용할 수 없습니다.

이것에 대한 해결책이 있습니까 (엄격한 잠수함을 비활성화하는 것 외에)?

내 코드의 형식은 다음과 같습니다.

for my $entry (@array){
    if ($string eq "text"){
         break;
    }
}

22
그리고 "엄격한 하위"가 설정되어 있지 않으면 "break"라는 하위를 찾을 수 없을 때 런타임 오류가 발생했을 것입니다.
Paul Tomblin

답변:


441

아, 찾았 어 당신 은 휴식 대신 마지막을 사용합니다

for my $entry (@array){
    if ($string eq "text"){
         last;
    }
}

이것은 의미상의 차이 일 뿐이며 "next"명령과의 텍스트 일관성 이외의 다른 것은 아닙니다.
면도기 폭풍

1
'break'가 5.010 이상의 실험 키워드라는 것은 말할 것도 없습니다. 그래서 당신은 그것을 사용해야하는 것이 아니라 잘못된 외부 오류가 발생할 수 있습니다. 주어진 블록 내에서 while 루프를 사용한 다음 중단하면 이론적으로 주어진 블록에 while 루프 만있는 경우 IF가 원하는 방식으로 작동하는 경우에만 작동합니다. 스칼라 변수가 주어진다고 가정 할 때 ...하지만 왜 모든 것이 휴식을 사용하기 위해 작동 하는가? 생각 & 생각하지 않는
osirisgothra

25
어떤 이유로 든 나는이 키워드 '마지막'을 완전히 기억할 수 없습니다. 항상 인터넷 검색 'perl break loop'로 끝납니다 :(
Thupten

또한 while() 루프에 대해 동일하게 작동합니다 . my @array = ("_", "apple", "orange"); my $thing; while ($thing = shift @array){ last if $thing =~ /[A-Za-z]/; } print($thing); # "apple"
HoldOffHunger

175

추가 데이터 (질문이 더있는 경우) :

FOO: {
       for my $i ( @listone ){
          for my $j ( @listtwo ){
                 if ( cond( $i,$j ) ){

                    last FOO;  # --->
                                   # |
                 }                 # |
          }                        # |
       }                           # |
 } # <-------------------------------

2
실제로 FOO 후 괄호가 필요하지 않습니다.
cjm

14
for $ i 루프 바로 뒤에 다른 코드가 있으면 건너 뛸 수도 있습니다. 바깥 쪽 {}은 베어 블록이며, 그 자체는 마지막 / 다시 실행 / 다음으로 올 수있는 재미있는 종류의 루프입니다.
ysth

18

간단히 last여기에서 작동합니다.

for my $entry (@array){
    if ($string eq "text"){
         last;
    }
}

중첩 루프가 있으면 last가장 안쪽 루프에서 빠져 나옵니다. 이 경우 라벨을 사용하십시오.

LBL_SCORE: {
    for my $entry1 (@array1) {
        for my $entry2 (@array2) {
            if ($entry1 eq $entry2) { # Or any condition
                last LBL_SCORE;
            }
        }
    }
 }

주어진 last문장은 컴파일러가 두 루프에서 나오도록 만듭니다. 루프 수에 관계없이 동일한 작업을 수행 할 수 있으며 어디에서나 레이블을 수정할 수 있습니다.


6

큰 반복에서는 인터럽트를 사용하는 것이 좋습니다. 그냥 눌러 Ctrl+는 C종료합니다 :

my $exitflag = 0;
$SIG{INT} = sub { $exitflag=1 };

while(!$exitflag) {
    # Do your stuff
}

실제로 매우 유용한 제안. +1
Keve

@PeterMortensen-이것은 Windows에서 잘 작동합니다. Windows에서 명심해야 할 유일한 것은 STDOUT '$ | = 1;`에 인쇄하면 자동
플러시를 켜는 것입니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.