서브 루틴


  • 서브 루틴의 이름은, 펄의 또 다른 식별자이다. 그리고 때때로 앞에 & 기호가 붙지만, 어떨때는 생략해도 되고 어떨때는 생략하면 안된다.

  • 펄에서 서브루틴 이름은 별도의 네임 스페이스에 존재하기 때문에 같은 이름의 스칼라 변수가 같은 프로그램 내에 존재할 수 있다.

  • 뭐 일반적으로 그럴 일은 별로 없겠지만 말이다.

서브 루틴을 선언하는 방법


  • 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