如何检查 @_ 的元素在 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;
}