2011-01-09 3 views
0

서브 루틴을 벗어나는 가장 좋은 방법은 무엇입니까 & 나머지 스크립트 처리를 계속 하시겠습니까?서브 루틴이 깨져

서브 루틴입니다 반환의 명백한 가장 좋은 방법을 진술의 비용에서

#!/usr/bin/perl 
use strict; 
use warnings; 

&mySub; 

print "we executed the sub partway through & continued w/ the rest 
of the script...yipee!\n"; 

sub mySub{ 

    print "entered sub\n"; 

    #### Options 
    #exit; # will kill the script...we don't want to use exit 
    #next; # perldoc says not to use this to breakout of a sub 
    #last; # perldoc says not to use this to breakout of a sub 
    #any other options???? 

    print "we should NOT see this\n"; 

} 
+14

'return'의 문제점은 무엇입니까? –

+0

잘 모르겠다 ... 어떻게해야 할 것인가? –

+1

+1 to 익명 :) –

답변

5

......

return 

질문에 어떤 숨겨진 미묘가없는 즉, 그게 명확하지 않다

편집 - 어쩌면 내가 무엇을보고있는 걸 볼 수있다

당신은 루프를 작성하는 경우

후 루프를 벗어나 려의 유효한 방법은 last

use strict ; 
    use warnings ; 
    while (<>) { 
     last if /getout/ ; 
     do_something() ; 
    } 

사용이 리팩터링 경우, 서브 루틴에서 얻을 수있는 사용하여 마지막으로 끝낼 수있다.

use strict ; 
    use warnings ; 
    while (<>) { 
     process_line() ; 
     do_something() ; 
    } 

    sub process_line { 
     last if /getout/ ; 
     print "continuing \n" ; 
    } 

이것은 당신이 return를 사용한다 위치를 last을 사용하는 것을 의미하고 자리에 wanings이있는 경우 오류를 얻을 :

Exiting subroutine via last at ..... some file ... 
+3

좋은 지적. 그리고 후자의 상황에서 스스로를 찾으면 정답은 'last if do_something()'에서'last '를 얻는 것입니다. 여기서 "break out"해야 할 때 do_something이 true를 반환하고 그렇지 않으면 false를 반환합니다. – DVK

0

하나를가 있다면 서브 루틴을 중단 종료를 사용하지 마십시오 누군가가 실수를 저지를 가능성이 있습니다. 다이 대신에 다이를 사용하면 eval에 의해 갇힐 수 있습니다.

관련 문제