Perl 中的函数签名
Perl函数或子例程是一组共同执行特定任务的语句。在每种编程语言中,用户都希望重用代码。因此用户将这段代码放在函数或子程序中,这样就不需要一次又一次地编写代码。在 Perl 中,术语函数、子例程和方法是相同的,但在某些编程语言中,它们被认为是不同的。在 Perl 编程中,subroutines 这个词用得最多,因为它是使用关键字 sub 创建的。每当调用该函数时,Perl 就会停止执行其所有程序并跳转到该函数以执行它,然后返回到它之前运行的代码部分。可以避免使用 return 语句。
定义子例程:在 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)
{
return $variable / 2;
}
# Function Call
print example(44);
输出:
22
如果我们传递的参数类型不是函数签名,那么它将产生如下所示的错误:
#!/usr/bin/perl
# Defining Function Signature
sub example(Int $variable)
{
return $variable / 2;
}
# Function Call with
# string type parameter
print example("44");
Error while compiling prog.pl
Calling example(Str) will never work with declared signature (Int $variable)
at prog.pl:7
参数数量的差异:
定义函数签名时,它还保存可以传递给它的参数的数量以及参数的类型。如果我们用不同数量的参数调用函数,那么它将导致错误,因为 Perl 对具有不同签名的函数具有不同的含义。
例子:
#!/usr/bin/perl
# Defining Function Signature
sub example(Int $variable)
{
return $variable / 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)
{
return $variable / 2;
}
# Function Call with Integer argument
# written as a string type
print example("44");
输出:
22
在上面的代码中,一个函数被声明为没有这种特定的参数类型,因此当一个整数值作为字符串传递给它时,它会自动将参数转换为整数形式并给出结果。但是,如果我们使用字符串参数调用函数并且要对其执行的操作需要一个整数值,那么它将导致错误,如下所示:
#!/usr/bin/perl
# Defining Function Signature
sub example($variable)
{
return $variable / 2;
}
# Function Call with
# string type argument
print example("Geeks");
输出:
Cannot convert string to number: base-10 number must begin with valid digits or ‘.’ Actually thrown at:
in sub example at prog.pl line 4
in block
in sub example at prog.pl line 4
in block