📜  珀尔 |可变和不可变参数

📅  最后修改于: 2022-05-13 01:54:54.844000             🧑  作者: Mango

珀尔 |可变和不可变参数

Perl函数或子例程是一组共同执行特定任务的语句。在每种编程语言中,用户都希望重用代码。因此用户将这段代码放在函数或子程序中,这样就不需要一次又一次地编写代码。这些子例程包含参数,这些参数定义在函数调用时可以传递给函数的参数的类型和数量。这些参数或参数用于根据函数中指定的表达式评估传递给函数的值。然后将这些值返回给指定的参数并传递给调用函数。

例子:

sub Function1(parameter1, parameter2){ statement; }

可变参数:

这些类型的参数是那些其值可以在作为参数传递到的函数中修改的参数。这意味着当使用调用函数将参数传递给函数时,其值将绑定到被调用函数中的参数,这意味着对该函数中值所做的任何更改也将反映在调用者的参数中。函数。

不可变参数:

这些参数的值不能在作为参数传递到的函数中修改。这意味着当使用调用函数将参数传递给函数时,子例程将接收一个值而不是变量。因此,对函数参数所做的任何更改都不会反映。

默认情况下,Perl 中的子程序参数是不可变的,这意味着它们不能在函数内更改,也不能意外修改调用函数的参数。
在某些语言中,这个过程被称为“按值调用” ,这意味着被调用的子例程接收一个值而不是变量,因此调用函数的参数不会被修改。

例子:

#!/usr/bin/perl
  
# Function Definition
sub Func(Int $variable)
{
    # Operation to be performed
    $variable /= 2; 
}
  
# Defining a local variable
my $value = 20;
  
# Function Call with local variable
print Func($value);

输出:

要更改这些参数的属性,需要使用特征。借助特征,可以在子程序中更改参数的值。

性状:

这些是预定义的内置子例程,当在方法中使用时,它们在编译时运行时修改方法的行为。特征甚至可以用于更改方法的主体或简单地用元数据标记方法。
特征可以有多种类型,具体取决于它们的用途,例如:

  • is cached trait 根据传递给它的参数自动缓存函数的返回值。
  • is rw trait 允许子程序参数的可写访问器。
  • is copy trait 允许在子例程中更改参数的值,但不更改调用函数中的参数。

示例:使用is copy特征

#!/usr/bin/perl
  
# Function Definition using
# 'is copy' trait
sub Func(Int $variable is copy)
{
    # Operation to be performed
    $variable += 5; 
}
  
# Defining a local variable
my $value = 10;
  
# Function Call with local variable
print Func($value), "\n";
  
# Checking if 
# $value gets updated or not
print $value;

输出:

15
10

在上面的代码中,使用is copy特征,因为默认情况下 Perl 不允许在子例程中修改参数。此特征允许程序将调用函数的参数值分配给被调用的子例程的参数。但是,这个 trait 只会改变被调用函数中参数的值。

示例:使用is rw特征

#!/usr/bin/perl
  
# Function Definition using
# 'is rw' trait
sub Func(Int $variable is rw)
{
    # Operation to be performed
    $variable += 5; 
}
  
# Defining a local variable
my $value = 10;
  
# Function Call with local variable
print Func($value), "\n";
  
# Checking if 
# $value gets updated or not
print $value;

输出:

15
15

在上面的代码中,当使用is rw而不是is copy trait 时,调用函数中传递的参数的值也会更新。

当使用is rw trait 时,被调用函数的参数绑定,因此如果对前者的值进行任何更改,后者会立即更新。这是因为被称为“引用调用”的过程。因为,两个参数都引用相同的内存位置(因为is rw特征)。这使得参数是完全可变的。