如何检查 @_ 的元素在 Perl sub 中是否为只读?
How to check if an element of @_ is read-only in a Perl sub?
当我的 sub 需要通过其中一个参数传回一些输出时(return 值已用于传回另一个输出),当该参数保持时会发生 运行-time 错误来自调用者的常量。示例:
# Increases the input by 1 and reports if the new value is bigger than 10.
sub IncreaseByOne {
$_[0] ++;
return ($_[0] > 10 ? 1 : 0);
}
my $x = 1;
IncreaseByOne($x); # This is OK.
IncreaseByOne(1); # This is not OK.
我的问题:sub 中有没有办法判断 $_[0] 是否只读? (我知道很多人会说通过其中一个参数 return 信息不是一个好的做法。但在我的情况下我确实需要这样做。)
如果 sub 应该增加值,那么如果不可能的话它应该失败:不要通过默默地忽略问题来让用户感到惊讶。这个错误是件好事!
但如果确实需要,你可以测试标量是否为 readonly:
use Scalar::Util 'readonly';
sub IncreaseByOne {
readonly($_[0]) or $_[0]++;
...
}
请注意,与其使用输出参数(这会导致您遇到的意外问题),通常更好的做法是 return 多个值的列表:
sub IncreaseByOne {
my ($x) = @_;
$x++;
my $more_than_ten = ($x > 10);
return $x, $more_than_ten;
}
当我的 sub 需要通过其中一个参数传回一些输出时(return 值已用于传回另一个输出),当该参数保持时会发生 运行-time 错误来自调用者的常量。示例:
# Increases the input by 1 and reports if the new value is bigger than 10.
sub IncreaseByOne {
$_[0] ++;
return ($_[0] > 10 ? 1 : 0);
}
my $x = 1;
IncreaseByOne($x); # This is OK.
IncreaseByOne(1); # This is not OK.
我的问题:sub 中有没有办法判断 $_[0] 是否只读? (我知道很多人会说通过其中一个参数 return 信息不是一个好的做法。但在我的情况下我确实需要这样做。)
如果 sub 应该增加值,那么如果不可能的话它应该失败:不要通过默默地忽略问题来让用户感到惊讶。这个错误是件好事!
但如果确实需要,你可以测试标量是否为 readonly:
use Scalar::Util 'readonly';
sub IncreaseByOne {
readonly($_[0]) or $_[0]++;
...
}
请注意,与其使用输出参数(这会导致您遇到的意外问题),通常更好的做法是 return 多个值的列表:
sub IncreaseByOne {
my ($x) = @_;
$x++;
my $more_than_ten = ($x > 10);
return $x, $more_than_ten;
}