具有精确签名/精确参数数量的 Perl 子例程

Perl subroutines with exact signature / exact number of parameters

我在某个地方的子例程定义中看到了 $ 的用法。为了进一步了解它,我用一个简单的子程序创建了各种案例,并且开始知道它用于定义具有精确签名的子程序。

谁能确认一下:

  1. 我说的对吗?我的意思是它是否用于此目的?
  2. 是否还有其他用途?
  3. 除了使用 my $param1 = shift;my (@params) = @_ 之外,还有其他方法可以在子程序中访问这些参数吗?

use strict;
use warnings;

# just a testing function
sub show($$){
    print "Inside show";
}

show(1, 1);   # works fine
show(1);     # gives compilation error
# Not enough arguments for main::show at test.pl line 8, near "1)"
# Execution of test.pl aborted due to compilation errors.

show(1, 1, 1);   # gives compilation error
# Too many arguments for main::show at test.pl line 8, near "1)"
# Execution of test.pl aborted due to compilation errors.       

您正在使用 subroutine prototypes. Don't. For more detail, see Why are Perl 5's function prototypes bad?

5.20 中引入的一项新的实验性功能是 subroutine signatures。那些做你希望子程序原型可以做的一切。

例如:

use strict;
use warnings;

use feature 'signatures';
no warnings 'experimental::signatures';

sub show ( $canvas, $actor ) {
    $actor->draw( $canvas, $COLOR{default});
}

等等