为Prototype添加可选参数



在一个模块中(不是由我写的),我有一个原型子,它需要一个代码ref并返回eval的结果:

sub proto (&) {
my $code = shift;
my $r    = eval {&$code};
return $r;
}
sub foo {
my $x = 1;
my $y = proto { $x = $x + 1; };
}
foo();

原型子模块在许多模块中经常被调用。现在我需要改变它,并想要添加一个可选参数,如:

sub proto (&) {
my $code = shift;
my $OptionalParameter = shift || 0;
...
}
sub foo {
my $x = 1;
my $OptionalParameter = 1;
my $y = proto { $x = $x + 1; }, $OptionalParameter;
}

但是这会导致警告"void context中无用使用私有变量";OptionalParameter美元。我还将原型声明更改为(&;$),这导致相同的警告。

如果我删除prototype声明(&),我会在调用proto时出现语法错误:Test.pl第47行";}";全局符号"$ optionalparameter;在TestQuery.pl第47行需要显式的包名(您是否忘记声明"my $OptionalParameter"?)

那么,我如何声明一个接受code ref和可选参数的sub呢?

在原型声明中使用';'分隔强制参数和可选参数。不要在代码块后面加上逗号:

sub foo(&;$) { my ($fn, $arg) = @_; ... }
foo { ... };
foo { ... } 1;

但是一般来说,最好避免使用原型,除非你试图模仿一个内置的perl函数的语法:

sub foo { my ($fn, $arg) = @_; ... }
foo(sub { ... });
foo(sub { ... }, 1);

最新更新