带有命名参数的 Perl 子例程

Shi*_*ing 1 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); 
Run Code Online (Sandbox Code Playgroud)

输出:

Error: Cannot assign to an immutable value
Run Code Online (Sandbox Code Playgroud)

谁能告诉我它所说的 Perl 版本是什么?它讨论了可以设置为可变或不可变的命名参数,这是我正在寻找的东西,但给出的示例对我来说根本不起作用。我正在使用 Perl 5.26.3。

ike*_*ami 7

任何人都可以知道它在谈论哪个 Perl 版本吗?

尽管有种种迹象表明,该片段根本不是 Perl。它是 Raku,Perl 的衍生产品,以前称为“Perl 6”。

Perl 有一个类似的功能,称为子例程签名。但参数并不是一成不变的。

#!/usr/bin/perl

use v5.36;  # For sub signatures

sub f( $param ) {
  $param /= 2;
}

say f( 20 );
Run Code Online (Sandbox Code Playgroud)

输出:

10
Run Code Online (Sandbox Code Playgroud)

我试图找出一种简单的方法来使作为参数传递给子例程的变量在被调用的子例程中不可变

您可以使用Readonly使变量不可变。

#!/usr/bin/perl

use v5.10;  # For `say`.

use Readonly qw( Readonly );

sub f {
   Readonly my $param => shift;
   $param /= 2;
}

say f( 20 );
Run Code Online (Sandbox Code Playgroud)

输出:

Modification of a read-only value attempted at a.pl line 9.
Run Code Online (Sandbox Code Playgroud)