mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Friday, September 08, 2006

[펄 예제] Perl 함수 만들기, 서브루틴 정의 - Function, Subroutine


펄의 함수는 서브루틴이라고 부릅니다. 펄에서, 함수(Function)와 서브루틴(Subroutine)은 같은 의미입니다. 여기서는 간편하게 그냥 함수라고 지칭했습니다.

가장 간단한 펄 함수 예제


foo 라는 함수를, "sub foo {..." 이렇게 정의하고, "&foo;" 이렇게 호출했습니다. "함수 정의"와 "함수 호출"의 순서는 상관 없습니다:
#!/usr/bin/perl


  &foo;


sub foo {
  print "안녕하세요.\n";
}

여기서 foo 라는 함수는 "안녕하세요."라는 문자열을 출력하는 간단한 함수입니다.

함수명 앞에 앰퍼샌드(&) 기호를 붙여
&foo;
이렇게 호출할 수도 있고

foo();
이렇게 괄호를 붙여 호출할 수도 있습니다.




함수의 인수 전달


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


  &foo(1, 2);


sub foo {
  print $_[0] + $_[1], "\n";
}

위의, foo 라는 함수는 인수(파라미터) 2개를 받아서, 합계를 내어 출력하는 함수입니다. 1+2=3이기에, 3이 출력됩니다.

$_[0] : 함수의 첫번째 인수
$_[1] : 함수의 두번째 인수
...
이런 식입니다.


또는 인수를 다음과 같이 받을 수도 있습니다:
#!/usr/bin/perl
use strict; use warnings;


  &foo(1, 2);


sub foo {
  my $var1 = shift @_;
  my $var2 = shift @_;

  print $var1 + $var2, "\n";
}

함수의 인수는 기본 배열인 @_ 에 항상 자동으로 들어갑니다. 배열의 가장 첫번째(가장 왼쪽) 요소를 밖으로 뽑아내는 shift 연산자를 사용하여, 첫번째 인수를 $var1 이라는 변수에 넣고, 두번째 인수도 그런 식으로 뽑아내어 사용했습니다.


함수의 결과값 반환 - Return Values


함수가 진정한 함수이기 위해서는 뭔가 값을 되돌려주어야 합니다.
#!/usr/bin/perl
use strict; use warnings;


  print &foo(1, 2), "\n";


sub foo {
  $_[0] + $_[1];
}

여기의 &foo(1, 2) 라는 함수는, 1+2를 계산하여, 결과값인 3를 리턴합니다. 그래서 함수 자체를 프린트하면 결과가 화면에 출력됩니다.

주의!
펄의 함수에서는, 무조건 마지막 행의 계산값이나 대입값을 리턴해 버립니다. 아주 편리할 수도 있고 아주 위험할 수도 있습니다. 편리함에는 항상 위험이 따르는데, 그것은 프로그래밍에서도 마찬가지입니다.

$_[0] + $_[1]; 이 줄의 의미는, 함수의 인수 2개를 더하기 하라는 의미입니다. 이 줄이 마지막 줄이기에, 이 줄의 계산값이 반환되어 버립니다.


이런 자동 반환을 피하려면, return 키워드를 사용하여 다음과 같이 명시적으로 값을 리턴해야 합니다.
#!/usr/bin/perl
use strict; use warnings;


  print foo(1, 2), "\n";


sub foo {
  my $temp = $_[0] + $_[1];
  return 100;
}

이제 앞줄의 결과가 어떻든, 무조건 100을 반환하게 만들었습니다.

return $_[0] + $_[1];
이렇게 하면 3이 반환됩니다.


물론 return 에는 값을 반환하는 기능 외에도, 현재 함수를 강제로 종료시키는 기능이 있습니다. 그냥
return;
이렇게 쓰면 함수가 즉시 종료됩니다.


※ 다만 위의 예제 코드 박스에서, $_[0] + $_[1]; 이 부분을 그대로 두면 "Useless use of addition (+) in void context at 0.pl line n." 이런 경고가 나오게 됩니다. "아무 쓸데없는 연산을 했다"는 경고입니다. 이제 $_[0] + $_[1]; 이 줄은 더 이상 값을 반환하지 않기에 아무 의미 없는 줄이 되었습니다. 그래서 경고가 나옵니다. 이 경우, my $temp = 이렇게 변수로 받아주면 경고가 없어집니다.




tag: perl
Perl | 펄

0 Comments:

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top