如何检查的@_元素是只读的在一个Perl子?
问题描述:
当我的子需要通过背面一些输出通的参数之一(返回值已经被用于传回另一个输出),当该参数保持从呼叫者的常数发生运行时错误。例如:如何检查的@_元素是只读的在一个Perl子?
# 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.
我的问题:是否有子中的办法判断$ _ [0]是只读的? (据我所知,很多人会说这是不是一个好的做法,以返回信息直通的参数之一,但我真的需要在我的处境。)
答
如果子应该增加的价值,那么它应该失败,如果这是不可能的:不要让用户默默地忽略问题。那个错误是件好事!
但如果确有必要,可以测试标是否readonly:
use Scalar::Util 'readonly';
sub IncreaseByOne {
readonly($_[0]) or $_[0]++;
...
}
注意,而是采用了参数(这会导致意想不到的问题,如你有经验的),它往往是更好的回报一个多值列表:
sub IncreaseByOne {
my ($x) = @_;
$x++;
my $more_than_ten = ($x > 10);
return $x, $more_than_ten;
}
+0
谢谢阿蒙。我确实在95%的时间内返回一个数组(或者返回一个数组)。但这次我真的必须这样做。感谢您展示Scalar :: Util :: readonly()函数! –
你试过'eval'吗? – toolic
你有'使用严格'和'使用警告'打开? – simbabque
希望得到比eval更清洁的方式。谢谢你提到它。 –