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

'엄격한 사용 '과'경고 사용'이 켜져 있습니까? – 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. 나는 배열 (또는 배열에 대한 ref)을 95 %의 시간으로 반환한다. 그러나 이번에는이 방법으로해야했습니다. Scalar :: Util :: readonly() 함수를 보여 주셔서 감사합니다! –