2017-10-10 67 views
2

当我的子需要通过背面一些输出通的参数之一(返回值已经被用于传回另一个输出),当该参数保持从呼叫者的常数发生运行时错误。例如:如何检查的@_元素是只读的在一个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]是只读的? (据我所知,很多人会说这是不是一个好的做法,以返回信息直通的参数之一,但我真的需要在我的处境。)

+0

你试过'eval'吗? – toolic

+0

你有'使用严格'和'使用警告'打开? – simbabque

+0

希望得到比eval更清洁的方式。谢谢你提到它。 –

回答

4

如果子应该增加的价值,那么它应该失败,如果这是不可能的:不要让用户默默地忽略问题。那个错误是件好事!

但如果确有必要,可以测试标是否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()函数! –

相关问题