Latest web development tutorials

펄 서브 루틴 (기능)

사용자 정의 함수입니다 펄 서브 루틴.

특별한 작업 분리를 수행하는 코드의 조각 펄 서브 루틴, 그것은 코드의 중복을 줄이고 프로그램을 읽기 쉽게 만들 수 있습니다.

다음과 같이 프로그램에 어디서나 나타날 수 있습니다 펄 서브 루틴, 구문은 다음과 같습니다

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