펄 서브 루틴 (기능)
사용자 정의 함수입니다 펄 서브 루틴.
특별한 작업 분리를 수행하는 코드의 조각 펄 서브 루틴, 그것은 코드의 중복을 줄이고 프로그램을 읽기 쉽게 만들 수 있습니다.
다음과 같이 프로그램에 어디서나 나타날 수 있습니다 펄 서브 루틴, 구문은 다음과 같습니다
sub subroutine{ statements; }
서브 루틴 호출 구문 :
subroutine( 参数列表 );
다음 버전의 서브 루틴 호출에 펄 5.0은 다음과 같습니다 :
&subroutine( 参数列表 );
새 버전에서는, 비록 통화 방식을 지원하지만 권장하지 않습니다.
간단한 인스턴스에서 다음에 우리는 볼 :
#!/usr/bin/perl # 函数定义 sub Hello{ print "Hello, World!\n"; } # 函数调用 Hello();
위의 프로그램은 출력은 다음과 같습니다
Hello, World!
서브 루틴에 매개 변수 전달
펄 서브 루틴, 여러 매개 변수 및 기타 프로그램을 수용 표시된 특수 배열 @_ 서브 루틴 매개 변수를 사용할 수 있습니다.
따라서, 서브 루틴 첫 번째 인수는 _ [0], 2 번째의 인수가 _ [1]에 $입니다 $입니다.
매개 변수가 스칼라 또는 배열 형식이든, 서브 루틴에 전달 된 매개 변수의 사용자는 참조로 펄 기본값을 호출합니다.
#!/usr/bin/perl # 定义求平均值函数 sub Average{ # 获取所有传入的参数 $n = scalar(@_); $sum = 0; foreach $item (@_){ $sum += $item; } $average = $sum / $n; print '传入的参数为 : ',"@_\n"; # 打印整个数组 print "第一个参数值为 : $_[0]\n"; # 打印第一个参数 print "传入参数的平均值为 : $average\n"; # 打印平均值 } # 调用函数 Average(10, 20, 30);
위의 프로그램은 출력은 다음과 같습니다
传入的参数为 : 10 20 30 第一个参数值为 : 10 传入参数的平均值为 : 20
사용자는 @_ 배열의 값을 변경함으로써 대응하는 실제 파라미터 값을 변경할 수있다.
서브 루틴 목록에 전달
@_ 변수 배열이기 때문에, 서브 루틴리스트를 전달할 수 있도록.
우리는 스칼라와 배열 매개 변수를 전달해야하는 경우 다음과 같이, 당신은, 마지막 매개 변수에 나열해야합니다
#!/usr/bin/perl # 定义函数 sub PrintList{ my @list = @_; print "列表为 : @list\n"; } $a = 10; @b = (1, 2, 3, 4); # 列表参数 PrintList($a, @b);
상기 프로그램은 스칼라 출력 결과의 배열을 병합한다 :
列表为 : 10 1 2 3 4
우리는 서브 프로그램의 여러 배열과 해시에 전달할 수 있지만, 여러 배열과 해시를 통과 않다면, 독립적 인 정체성의 상실로 이어질 것입니다. 그래서 우리는 통과 기준을 (다음 섹션을 소개합니다)를 사용합니다.
서브 프로그램에 전달 해시
해시 테이블은 서브 루틴으로 전달 될 때,이 키 / 값 쌍의 목록을 확장 될 해시 테이블 @_에 복사한다.
#!/usr/bin/perl # 方法定义 sub PrintHash{ my (%hash) = @_; foreach my $key ( keys %hash ){ my $value = $hash{$key}; print "$key : $value\n"; } } %hash = ('name' => 'w3big', 'age' => 3); # 传递哈希 PrintHash(%hash);
위의 프로그램 실행 출력은 다음과 같습니다
age : 3 name : w3big
서브 루틴 반환 값
다른 프로그래밍 언어는 값을 반환 return 문을 사용하여 같은 서브 루틴이 될 수 있습니다.
돌아올 수없는 문, 반환 값으로 서브 루틴 문 다음 마지막 줄 경우.
#!/usr/bin/perl # 方法定义 sub add_a_b{ # 不使用 return $_[0]+$_[1]; # 使用 return # return $_[0]+$_[1]; } print add_a_b(1, 2)
위의 프로그램 실행 출력은 다음과 같습니다
3
서브 루틴 우리는 스칼라, 배열과 해시를 반환 할 수 있지만, 대가로 여러 배열과 해시는 독립적 인 정체성의 상실로 이어질 것입니다. 그래서 우리는 여러 배열 및 함수를 반환하는 참조 (다음 섹션을 소개합니다)를 사용합니다.
서브 루틴 private 변수
기본적으로 펄으로 모든 변수는 변수가 어느 곳에서나 프로그램에서 호출 할 수 있습니다 즉, 글로벌 변수입니다.
우리는 개인 변수를 설정해야하는 경우, 설정내 연산자를 사용합니다.
내 운영자는 어휘 적 범위 변수, 폐쇄 범위가 끝날 때까지 명령문의 시작 부분에있는 나의생존 장소로 작성된 변수를 만듭니다.
범위는이 지역이 쌍 파일이 될 수 있습니다 중괄호 또한, 만약하면서, 위해, foreach는, 평가 문자열이 될 수 있습니다, 될 수있는 폐쇄를 의미한다.
다음의 예는 하나 또는 그 이상의 개인 변수를 선언하는 방법을 보여줍니다
sub somefunc { my $variable; # $variable 在方法 somefunc() 外不可见 my ($another, @an_array, %a_hash); # 同时声明多个变量 }
#!/usr/bin/perl # 全局变量 $string = "Hello, World!"; # 函数定义 sub PrintHello{ # PrintHello 函数的私有变量 my $string; $string = "Hello, w3big!"; print "函数内字符串:$string\n"; } # 调用函数 PrintHello(); print "函数外字符串:$string\n";
위의 프로그램 실행 출력은 다음과 같습니다
函数内字符串:Hello, w3big! 函数外字符串:Hello, World!
임시 할당 변수
우리는 글로벌 변수에 대한 로컬 임시 값을 사용할 수 있습니다, 종료 후 원래 값의 범위를 다시이기도합니다.
로컬 변수가 존재하지 않는 메인 프로그램에서 정의되지만 루틴 및 서브 루틴 호출 루틴으로 존재한다. 당신과 같은, 그것에게 가치를 제공 할 수 있습니다 정의 할 때 :
#!/usr/bin/perl # 全局变量 $string = "Hello, World!"; sub Printw3big{ # PrintHello 函数私有变量 local $string; $string = "Hello, w3big!"; # 子程序调用的子程序 PrintMe(); print "Printw3big 函数内字符串值:$string\n"; } sub PrintMe{ print "PrintMe 函数内字符串值:$string\n"; } sub PrintHello{ print "PrintHello 函数内字符串值:$string\n"; } # 函数调用 Printw3big(); PrintHello(); print "函数外部字符串值:$string\n";
위의 프로그램 실행 출력은 다음과 같습니다
PrintMe 函数内字符串值:Hello, w3big! Printw3big 函数内字符串值:Hello, w3big! PrintHello 函数内字符串值:Hello, World! 函数外部字符串值:Hello, World!
정적 변수
상태 연산자 함수는 C의 정적 수정에, 상태 키워드가 지속적으로 지역 변수가 될 것이다 유사하다.
또한 어휘 상태 변수 어휘 가변 도메인의 정의는, 예를 들면 유효 :
#!/usr/bin/perl use feature 'state'; sub PrintCount{ state $count = 0; # 初始化变量 print "counter 值为:$count\n"; $count++; } for (1..5){ PrintCount(); }
위의 프로그램 실행 출력은 다음과 같습니다
counter 值为:0 counter 值为:1 counter 值为:2 counter 值为:3 counter 值为:4
주 1 : 상태는 서브 루틴 내부의 폐쇄 범위의 변수를 만들 수 있습니다.
주 2 : 사용은 사용하기 전에 상태가 펄 5.9.4에서 도입, 그것은 추가해야합니다.
3 주 : 상태가 스칼라, 배열, 해시를 선언 할 수 있습니다. 배열과 해시를 선언 할 때, 당신은 (적어도 펄 5.14은 지원되지 않음)을 초기화 할 수 없습니다.
서브 루틴 호출 컨텍스트
서브 루틴 호출, 그러한 다음의 현지와 상황에 따라 다른 유형의 값으로 돌아갑니다 () 스칼라 문맥에서 서브 루틴리스트 문맥에서 문자열 목록을 반환 반환
#!/usr/bin/perl # 标量上下文 my $datestring = localtime( time ); print $datestring; print "\n"; # 列表上下文 ($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time); printf("%d-%d-%d %d:%d:%d",$year+1990,$mon+1,$mday,$hour,$min,$sec); print "\n";
위의 프로그램 실행 출력은 다음과 같습니다
Sun Jun 12 15:58:09 2016 2106-6-12 15:58:9