서브 루틴
-
서브 루틴의 이름은, 펄의 또 다른 식별자이다. 그리고 때때로 앞에
&
기호가 붙지만, 어떨때는 생략해도 되고 어떨때는 생략하면 안된다. -
펄에서 서브루틴 이름은 별도의 네임 스페이스에 존재하기 때문에 같은 이름의 스칼라 변수가 같은 프로그램 내에 존재할 수 있다.
-
뭐 일반적으로 그럴 일은 별로 없겠지만 말이다.
서브 루틴을 선언하는 방법
sub
라는 키워드를 사용하고{ }
사이에 함수의 내용을 넣으면 된다.
sub marine {
$n += 1;
print "hello, sailor number $n\n";
}
-
만약 중복되는 이름의 서브루틴이 있을 경우 뒤에오는 서브 루틴이 앞의 것을 대체한다.
-
그리고 펄의 서브루틴에서는 전역변수에 접근이 가능하다. 이 점은 많은 버그가 일어날 것 같다. 심지어 책에서는 이러한 점이 펄 사용자로 하여금 성난 군중을 만들어서 펄 개발팀을 도망가게 만들었다고 표현했다.
-
곧 서브루틴안에서만 사용가능한 변수를 배우게 될 것이다.
서브 루틴을 호출하는 방법
- 서브 루틴을 호출하는 방법은
&
를 이용해서 호출할 수 있다.
&marine;
&marine;
&marine;
&marnie;
- 이는 위에서 선언한 서브루틴인
marine
서브루틴을 호출한 것이다.
서브루틴의 반환값
-
서브루틴을 호출할 때는 그 자체로 표현식으로 처리된다. 반환된 값을 사용하던지 안하던지는 상관이 없다.
-
모든 서브 루틴값은 반환 값을 지닌다. 하지만 그 모두가 의미있는 값을 반환하는 것은 아니다.
-
반환 값을 가지는 서브루틴이나 가지지 않는 서브루틴 사이의 차이점은 없다.
-
펄에서는 따로,
return
와 같은 키워드를 사용하지 않는다. 마지막에 위치한 값이 자동으로 반환값이 된다.
sub sum_of_fred_and_barney {
print "hey, you called me sum_of_fred_and_barney subroutine!";
$fred + $barney;
}
-
위의 예제에서는 자동으로
$fred+ $barney
가 리턴값이 된다. -
만약 서브루틴의 마지막에 값이 아닌
print
가 오면 그냥 정상적으로 출력되었다는 뜻으로1
값이 반환된다. 이러한 동작이 원한것이 아니라면 주의를 해야한다.
sub sum_of_fred_and_barney {
print "hey, you called me sum_of_fred_and_barney subroutine!";
$fred + $barney;
print "hey, I'm returning a value now\n";
}
-
그렇다면, 위의 예제에서와 같이 중간의 계산 값은 어떻게 되는가? 펄은 이러한 값들은 사용하지 않고 그냥 버려버린다.
-
만약 펄에서 경고를 표시해주도록 설정했다면, 이러한 연산이 있다고 알려줄 것이다.
-
그리고 마지막 예제는 큰 값을 리턴하는 서브 루틴이다.
sub larger_of_fred_or_barney {
if ($fred > $barney) {
$fred;
} else {
$barney;
}
}
참고 문헌
>> Home