Perl 서브루틴(함수)


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

Perl 서브루틴은 특별한 작업을 수행하는 분리된 코드 조각으로, 반복되는 코드를 줄이고 프로그램을 더 쉽게 읽을 수 있도록 해줍니다.

Perl 서브루틴은 프로그램의 어느 위치에나 나타날 수 있으며 구문 형식은 다음과 같습니다.

sub subroutine{
   statements;
}

서브루틴 호출을 위한 구문 형식:

subroutine( 参数列表 );

버전에서 서브루틴 메소드 호출 Perl 5.0 이하 다음과 같습니다:

&subroutine( 参数列表 );

새 버전에서는 이 호출 방법도 지원되지만 권장되지 않습니다.

다음으로 간단한 예를 살펴보겠습니다.

#!/usr/bin/perl

# 函数定义
sub Hello{
   print "Hello, World!\n";
}

# 函数调用
Hello();

위 프로그램을 실행하면 출력 결과는 다음과 같습니다.

Hello, World!

매개변수를 서브루틴에 전달

Perl 서브루틴은 다른 프로그래밍과 마찬가지로 여러 매개변수를 허용할 수 있습니다. 서브루틴 매개변수는 특수 배열 @_로 표시됩니다.

따라서 서브루틴의 첫 번째 매개변수는 $_[0]이고 두 번째 매개변수는 $_[1] 등입니다.

매개변수가 스칼라인지 배열인지에 관계없이 사용자가 매개변수를 서브루틴에 전달하면 Perl은 기본적으로 해당 매개변수를 참조로 호출합니다.

#!/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

여러 배열과 해시를 서브루틴에 전달할 수 있지만 여러 배열과 해시를 전달하면 독립적인 ID가 손실됩니다. 따라서 통과하려면 참조(다음 장에서 소개됨)를 사용해야 합니다.

해시를 서브루틴에 전달

해시 테이블이 서브루틴에 전달되면 @_에 복사되고 해시 테이블은 키/값 조합 목록으로 확장됩니다. .

#!/usr/bin/perl

# 方法定义
sub PrintHash{
   my (%hash) = @_;

   foreach my $key ( keys %hash ){
      my $value = $hash{$key};
      print "$key : $value\n";
   }
}
%hash = ('name' => 'php', 'age' => 3);

# 传递哈希
PrintHash(%hash);

위 프로그램의 실행 출력은 다음과 같습니다.

age : 3
name : php

하위 프로그램 반환 값

하위 프로그램은 return 문을 사용하여 다른 프로그래밍과 마찬가지로 함수 값을 반환할 수 있습니다. 언어.

return 문을 사용하지 않으면 서브루틴의 마지막 줄이 반환 값이 됩니다.

#!/usr/bin/perl

# 方法定义
sub add_a_b{
   # 不使用 return
   $_[0]+$_[1];  

   # 使用 return
   # return $_[0]+$_[1];  
}
print add_a_b(1, 2)

위 프로그램의 실행 출력은 다음과 같습니다.

3

서브루틴에서는 스칼라, 배열 및 해시를 반환할 수 있지만 여러 배열과 해시를 반환하는 경우 독립적인 값은 다음과 같습니다. 로고를 잃었습니다. 따라서 여러 배열과 함수를 반환하려면 참조(다음 장에서 소개)를 사용해야 합니다.


서브루틴의 개인 변수

기본적으로 Perl의 모든 변수는 전역 변수입니다. 즉, 프로그램의 어느 곳에서나 변수를 호출할 수 있습니다.

개인 변수를 설정해야 하는 경우 my 연산자를 사용하여 설정할 수 있습니다.

my 연산자는 어휘 범위 변수를 생성하는 데 사용됩니다. my를 통해 생성된 변수는 선언 시작부터 닫힌 범위가 끝날 때까지 살아 있습니다.

닫힌 범위는 중괄호 쌍 내의 영역을 나타내며 파일이거나 if, while, for, foreach, eval 문자열일 수 있습니다.

다음 예에서는 하나 이상의 개인 변수를 선언하는 방법을 보여줍니다.

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, php!";
   print "函数内字符串:$string\n";
}
# 调用函数
PrintHello();
print "函数外字符串:$string\n";

위 프로그램의 실행 출력은 다음과 같습니다.

函数内字符串:Hello, php!
函数外字符串:Hello, World!

변수 임시 할당

local을 사용하여 전역 변수에 임시 값을 제공하고 범위를 종료한 후 원래 값을 반환할 수 있습니다.

정의된 지역 변수는 메인 프로그램에는 존재하지 않지만, 서브 프로그램 및 서브 프로그램이 호출하는 서브 프로그램에는 존재합니다. 다음과 같이 정의할 때 값을 할당할 수 있습니다.

#!/usr/bin/perl

# 全局变量
$string = "Hello, World!";

sub Printphp{
   # PrintHello 函数私有变量
   local $string;
   $string = "Hello, php!";
   # 子程序调用的子程序
   PrintMe();
   print "Printphp 函数内字符串值:$string\n";
}
sub PrintMe{
   print "PrintMe 函数内字符串值:$string\n";
}

sub PrintHello{
   print "PrintHello 函数内字符串值:$string\n";
}

# 函数调用
Printphp();
PrintHello();
print "函数外部字符串值:$string\n";

위의 프로그램 실행 출력 결과는 다음과 같습니다.

PrintMe 函数内字符串值:Hello, php!
Printphp 函数内字符串值:Hello, php!
PrintHello 函数内字符串值:Hello, World!
函数外部字符串值:Hello, World!

정적 변수

상태 연산자는 C의 연산자와 유사합니다. static 수정자와 상태 키워드는 지역 변수를 지속성으로 만듭니다.

state도 어휘 변수이므로 변수가 정의된 어휘 범위에서만 유효합니다. 예:

#!/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: 상태는 Perl 5.9.4부터 도입되었으므로 사용하기 전에 반드시 use를 추가해야 합니다.

참고 3: 상태는 스칼라, 배열 및 해시를 선언할 수 있습니다. 그러나 배열과 해시는 선언될 때 초기화될 수 없습니다(적어도 Perl 5.14에서는 그렇지 않습니다).


서브루틴 호출 컨텍스트

서브루틴 호출 프로세스 중에 컨텍스트에 따라 다양한 유형의 값이 반환됩니다. 예를 들어 다음 localtime() 서브루틴입니다. 스칼라 컨텍스트 문자열로 반환, 목록 컨텍스트에서 목록 반환:

#!/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