사용자 정의 함수

여기서는 간단한 소개만 하도록 하겠습니다.

Subroutine은 기존의 함수들로는 할 수 없는 일을 반복적으로 하거나, 전체 프로그램 운영상의 효율을 증대시키기 위해, 그리고 멋을 내고 싶을 때 만듭니다. 

Subroutine은 다음과 같이 정의합니다.

sub mysubroutine
{
  print "Just print a simple message.\n";
}
위의 Subroutine은 그다지 유용한 프로그램은 아닌것 같군요. 하여간
&mysubroutine;   #  & 를 붙여서 부릅니다.
이라고 하면, Just print a simple message.\n을 화면에 출력합니다. Perl의 subroutine을 정의할 때는 인수의 종류나 개수 등을 특별히 정하지 않습니다. 그저 사용할 뿐입니다.
인수는 @_라는 특수한 배열로 전달됩니다. $_와는 별개의 존재인 것 아시지요 ? 눈의 착각일 뿐입니다. 각 subroutine은 제 각기 자신의 @_를 가지고 있으므로 subroutine에서 다른 subroutine을 부를 때 공연한 걱정은 하지 않으셔도 됩니다.
다음을 한번 해 보세요.
# param.pl

sub args {
  print "@_\n";
}

sub bigargs {
      # ( "Shut", "up,", "please !" )라는 배열이 넘어옵니다
  &args( "Hello", "there", "?" );
  print "@_\n";
}

&bigargs( "Shut", "up,", "please !" );
각각의 @_가 제 역할을 다 하는것이 보이시죠 ?

@_도 배열이므로 $_[0], $_[1], $#_ 등 또한 제대로 사용할 수 있습니다.

Subroutine은 마지막으로 도출된 값을 리턴하거나 return이라는 함수로 명확하게 표시하는 값을 리턴합니다.

# return.pl

$max = &max( 10, 5 );
print "$max\n";

$max = &max( 8, 15 );
print "$max\n";

sub max {
  if( $_[0] > $_[1] )
    { return $_[0]; }
  $_[1];
}
Subroutine밖에서의 변수들은 특별히 명시하지 않는 한 subroutine의 안쪽에서도 볼 수 있습니다. 볼 수 있다는 말은 변화시켜서는 않되는 변수의 값을 '실수로 인하여' 변화 시킬 수 있다는 말입니다.
# oooops.pl

$dum = "Very very important data";

$max = &max( 10, 5 );
print "10, 5 - $max\n";

$max = &max( 9, 14 );
print "9, 14 - $max\n";

print "$dum\n";   #  oooops !!

sub max {
  $dum = ( $_[0] > $_[1] ) ? $_[0] : $_[1];
}
이런 효과를 일부러 기대한 경우가 아니라면, 그리고 변수이름을 기필코 그렇게 하고 싶거나, 혹 다른 사람이 라이브러리로 쓰려는것을 예상하여 혹 있을지도 모르는 불미스러운 일을 미연에 방지하고 싶을 때는 local이라는 범위변경자(modifier)를 사용합니다.

연산자 " ? : "

위의 예제중에서 subroutine에 사용된 연산자 ?:는 조건의 참, 거짓에 따라 서로 다른 값을 리턴하는 연산자입니다. 형식은
(조건식) ? 참일때의_값 : 거짓일때의_값
입니다. 위의 예제의 경우 ( $_[0] > $_[1] )가 참일 경우 $_[0]을, 거짓일 경우 $_[1]을 리턴함을 알 수 있습니다.


다음은 위의 예제를 약간만 변형한 것입니다.
# local.pl

$dum = "Very very important data";

$max = &max( 10, 5 );
print "10, 5 - $max\n";

$max = &max( 9, 14 );
print "9, 14 - $max\n";

print "$dum\n";  # Bueno ! No problemo !

sub max {
  local( $dum ) = ( $_[0] > $_[1] ) ? $_[0] : $_[1];
     # 이 $dum은 바깥의 $dum과는 다릅니다.
}
실험해 보셨지요 ?
local은 변수를 '지역화'하므로써 subroutine 안팎의 변수이름이 같더라도 실제의 '존재'는 다르게 조정합니다. 대표적인 지역변수가 바로 @_, $_[0], $_[1], $_[2] .... 입니다. 위에서 보셨듯이 각각의 subroutine마다 서로 다른 @_를 가지고 있었던 것을 기억하실겁니다.

이전 | 목록 | 다음
Comments