2017-10-10 6 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

「評価する」ようにしましたか? – toolic

+0

'use strict'と' use warnings'が有効になっていますか? – 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

ありがとうAmon。私は時間の95%の配列(または配列への参照)を返します。しかし、今度は本当にこのようにしなければなりませんでした。 Scalar :: Util :: readonly()関数を見せてくれてありがとう! –

関連する問題