tim*_*m93 3 parameters perl unpack shift
以下代码是否安全?它是否运行在所有perl版本> = 5.8?是否保证在解压缩@_之前执行转换?
sub f1 {
shift->update(p1 => shift, p2 => shift, @_);
}
Run Code Online (Sandbox Code Playgroud)
详细替代代码:
sub f2 {
my ($self, $p1, $p2, @r) = @_;
$self->update(p1 => $p1, p2 => $p2, @r);
}
Run Code Online (Sandbox Code Playgroud)
它在所有现有的Perl解释器中都能正常运行.
但是,逗号运算符的操作数评估顺序在标量上下文中使用时会被记录,但不会在列表上下文中使用时(如此情况).更糟糕的是,它是在其他一些语言中未定义行为的区域中的无证行为.我没有看到行为发生变化,但也不是很安全.
妥协:
sub f3 {
my $self = shift;
my $p1 = shift;
my $p2 = shift;
$self->update(p1 => $p1, p2 => $p2, @_);
}
Run Code Online (Sandbox Code Playgroud)
如果你绝对想要变量,你可以安全地使用以下内容:
sub f4 { $_[0]->update(p1 => $_[1], p2 => $_[2], @_[3..$#_]) }
Run Code Online (Sandbox Code Playgroud)
不过,我不知道你为什么要使用它.即使没有计算命名参数的自记录属性的损失,也很难阅读.