Perl 서브루틴도 사용자 정의 함수입니다.
Perl 서브루틴은 특정 작업을 수행하는 분리된 코드 조각으로, 반복적인 코드를 줄이고 프로그램을 더 쉽게 읽을 수 있도록 해줍니다.
Perl 서브루틴은 프로그램의 어느 위치에나 나타날 수 있으며 구문 형식은 다음과 같습니다.
하위 서브루틴{ 문;}
서브루틴 호출을 위한 구문 형식:
서브루틴(매개변수 목록);
Perl 5.0 이하 버전에서는 서브루틴을 호출하는 방법은 다음과 같습니다.
&subroutine(매개변수 목록);
새 버전에서는 이 호출 방법도 지원되지만 사용을 권장하지 않습니다.
다음으로 간단한 예를 살펴보겠습니다.
위 프로그램을 실행하면 출력 결과는 다음과 같습니다.
안녕하세요, 월드!
Perl 하위 프로그램은 다른 프로그래밍과 마찬가지로 여러 매개변수를 허용할 수 있습니다. 하위 프로그램 매개변수는 특수 배열 @_로 표시됩니다.
따라서 서브루틴의 첫 번째 매개변수는 $_[0]이고 두 번째 매개변수는 $_[1] 등입니다.
매개변수가 스칼라인지 배열인지에 관계없이 사용자가 매개변수를 서브루틴에 전달하면 Perl은 기본적으로 이를 참조로 호출합니다.
위 프로그램을 실행하면 출력 결과는 다음과 같습니다.
전달된 매개변수는 다음과 같습니다: 10 20 30 첫 번째 매개변수의 값: 10 전달된 매개변수의 평균값: 20
사용자는 @_ 배열의 값을 변경하여 해당 실제 매개변수의 값을 변경할 수 있습니다.
@_ 변수는 배열이므로 목록을 서브루틴에 전달할 수 있습니다.
그러나 스칼라 및 배열 매개변수를 전달해야 하는 경우 아래와 같이 마지막 매개변수에 목록을 배치해야 합니다.
위 프로그램은 스칼라와 배열을 결합하고 출력은 다음과 같습니다.
목록은 다음과 같습니다: 10 1 2 3 4
여러 배열과 해시를 서브루틴에 전달할 수 있지만 여러 배열과 해시를 전달하면 독립적인 ID가 손실됩니다. 따라서 통과하려면 참조(다음 장에서 소개됨)를 사용해야 합니다.
해시 테이블이 서브루틴에 전달되면 @_에 복사되고 해시 테이블은 키/값 조합 목록으로 확장됩니다.
위 프로그램의 실행 결과는 다음과 같습니다.
나이: 3이름: codercto
서브루틴은 다른 프로그래밍 언어와 마찬가지로 return 문을 사용하여 함수 값을 반환할 수 있습니다.
return 문을 사용하지 않으면 서브루틴의 마지막 줄이 반환 값으로 사용됩니다.
위 프로그램의 실행 결과는 다음과 같습니다.
3
서브루틴에서 스칼라, 배열 및 해시를 반환할 수 있지만 여러 배열과 해시를 반환하면 독립적인 ID가 손실됩니다. 따라서 여러 배열과 함수를 반환하려면 참조(다음 장에서 소개)를 사용해야 합니다.
기본적으로 Perl의 모든 변수는 전역 변수입니다. 즉, 변수는 프로그램의 어느 곳에서나 호출될 수 있습니다.
개인 변수를 설정해야 하는 경우 my 연산자를 사용하여 설정할 수 있습니다.
my 연산자는 어휘 범위 변수를 생성하는 데 사용됩니다. my를 통해 생성된 변수는 선언 시작부터 닫힌 범위가 끝날 때까지 유지됩니다.
닫힌 범위는 중괄호 쌍, 파일 또는 if, while, for, foreach 또는 eval 문자열 내의 영역을 나타냅니다.
다음 예에서는 하나 이상의 개인 변수를 선언하는 방법을 보여줍니다.
sub somefunc { my $variable; # $variable은 somefunc() 메서드 외부에서 볼 수 없습니다. my ($another, @an_array, %a_hash) # 동시에 여러 변수 선언}
위 프로그램의 실행 결과는 다음과 같습니다.
함수 내부 문자열: Hello, Codercto! 함수 외부 문자열: Hello, World!
local을 사용하여 전역 변수에 임시 값을 제공하고 범위를 종료한 후 원래 값을 반환할 수 있습니다.
local로 정의된 변수는 메인 프로그램에는 존재하지 않지만 서브 프로그램과 서브 프로그램이 호출하는 서브 프로그램에는 존재합니다. 정의할 때 다음과 같은 값을 할당할 수 있습니다.
위 프로그램의 실행 결과는 다음과 같습니다.
PrintMe 함수 내 문자열 값: Hello, Codercto!PrintCodercto 함수 내 문자열 값: Hello, Codercto!PrintHello 함수 내 문자열 값: Hello, World! 함수 외부 문자열 값: Hello, World!
상태 연산자의 기능은 C의 정적 수정자와 유사합니다. 상태 키워드는 지역 변수를 지속성으로 만듭니다.
state도 어휘 변수이므로 변수가 정의된 어휘 범위에서만 유효합니다.
위 프로그램의 실행 결과는 다음과 같습니다.
카운터 값: 0 카운터 값: 1 카운터 값: 2 카운터 값: 3 카운터 값: 4
참고 1: 상태는 닫힌 범위가 서브루틴 내에 있는 변수만 생성할 수 있습니다.
참고 2: 상태는 Perl 5.9.4부터 도입되었으므로 사용하기 전에 반드시 추가해야 합니다.
참고 3: 상태는 스칼라, 배열 및 해시를 선언할 수 있습니다. 그러나 배열과 해시는 선언될 때 초기화될 수 없습니다(적어도 Perl 5.14에서는 그렇지 않음).
서브루틴 호출 프로세스 중에 컨텍스트에 따라 다양한 유형의 값이 반환됩니다. 예를 들어 다음 localtime() 서브루틴은 스칼라 컨텍스트에서 문자열을 반환하고 목록 컨텍스트에서 목록을 반환합니다.
위 프로그램의 실행 결과는 다음과 같습니다.
6월 12일 일 15:58:09 20162106-6-12 15:58:9