Perl 函数签名
一个Perl函数或子程序是一组语句,它们一起执行一个特定的任务。在每一种编程语言中,用户都希望能够重复使用代码。因此,用户将这部分代码放在函数或子程序中,这样就不需要反复编写代码了。在Perl中,函数、子程序和方法是相同的,但在一些编程语言中,这些术语被认为是不同的。子程序这个词在Perl编程中使用得最多,因为它是用关键字sub创建的。每当有对函数的调用时,Perl就会停止执行它的所有程序,并跳到函数上执行,然后返回到先前运行的那段代码。人们可以避免使用返回语句。
定义子程序: Perl中定义子程序的一般形式如下
sub subroutine_name
{
# body of method or subroutine
}
函数签名: 当一个函数被定义时,一组参数也被定义在括号内,以定义它在函数调用时将接收的参数类型。这个函数签名可以包含一个参数或一个参数列表。一个子程序或函数的签名被定义后,只能接收子程序中定义的参数类型。如果传递给子程序的参数与它的签名不同,它将产生一个错误。
一个函数签名可以说明很多关于子程序的类型。它使用户能够制造不同的同名子程序,但有不同的签名,即有不同的参数。在Perl中,不同的子程序名称可以相同,但其参数必须不同。
例子
sub example_func(variable)
{
statement;
}
sub example_func(variable1, $variable2)
{
statement;
}
在上面的例子中,子程序的名称是相同的,但它们的参数数不同,因此,它们不会被认为是不同的子程序,你的Perl代码也不会产生任何错误。
传递与签名类型不同的参数: 当一个函数被定义为签名时,该子程序必然会接受与签名类型相同的参数。如果传递了一个与函数签名不同的参数,那么将产生一个错误,从而导致代码的编译失败。
例子
#!/usr/bin/perl
# Defining Function Signature
sub example(Int variable)
{
returnvariable / 2;
}
# Function Call
print example(44);
输出
22
如果我们传递的参数的类型不是函数签名,那么它将产生一个错误,如下图所示。
#!/usr/bin/perl
# Defining Function Signature
sub example(Int variable)
{
returnvariable / 2;
}
# Function Call with
# string type parameter
print example("44");
编译prog.pl时出错
调用example(Str)将永远不会与已声明的签名(Int $variable)一起工作
at prog.pl:7
参数数量的差异:
当一个函数签名被定义时,它也持有可以传递给它的参数数量,以及参数的类型。如果我们用不同的参数数来调用这个函数,就会导致一个错误,因为Perl对不同签名的函数有不同的含义。
例子
#!/usr/bin/perl
# Defining Function Signature
sub example(Int variable)
{
returnvariable / 2;
}
# Function Call with
# two arguments
print example(44, 29);
输出
Error while compiling prog.pl
Calling example(Int, Int) will never work with declared signature (Int $variable)
at prog.pl:10
函数签名是一个有用的方面,但有时会让一些程序员感到非常烦恼,因为定义函数签名限制了该函数对特定类型参数的使用。如果定义的函数没有签名,那么对可以传递给它的参数类型就没有限制。
例子
#!/usr/bin/perl
# Defining Function Signature
sub example(variable)
{
returnvariable / 2;
}
# Function Call with Integer argument
# written as a string type
print example("44");
输出
22
在上面的代码中,一个函数被声明为没有特定的参数类型,因此当一个整数值作为字符串传递给它时,它会自动将参数转换为整数形式并给出结果。但是,如果我们用一个字符串参数调用该函数,而要对其进行的操作需要一个整数值,那么它将导致一个错误,如下所示。
#!/usr/bin/perl
# Defining Function Signature
sub example(variable)
{
returnvariable / 2;
}
# Function Call with
# string type argument
print example("Geeks");
输出
Cannot convert string to number: base-10 number must begin with valid digits or ‘.’
in sub example at prog.pl line 4
in block at prog.pl line 11
Actually thrown at:
in sub example at prog.pl line 4
in block at prog.pl line 11