2012-07-18 3 views
2

이 질문은 Perl에서의 가독성 및 좋은 실행과 관련이 있습니다. 내가 변수 $ array_ref이있는 경우Perl 구문 및 가독성 - 배열 참조의 요소 찾기

  • , 난 그냥 그 배열이 텍스트 '일치'와 같은 적어도 하나 개의 요소가있는 경우 알 필요가 : 내가 할 몇 가지 검사를해야합니다. 스칼라 1

  • 동일한 경우

  • 내가 확인 (수 있는지?인가? 또는 정의되지 않은) $의 array_ref이 정의되지 또는 $의 array_ref가 정의되면, 그것은 참조하는 배열이 비어있는 가능성이있다

    my $is_compatible = $array_ref and defined grep $_ eq 'match', @{$array_ref} 
            and $my_num = 1 and $my_text eq 'yes'. 
    

    이 더 EA로 고쳐 수 있습니다 : 다른 스칼라 여기

내가 사용하고있는 현재의 코드는 '예'와 동일한 경우는 내가 확인 변덕스럽고 읽을 수있는? 또한, $ array_ref의 값이 될 수있는 모든 가능한 유스 케이스에 맞을까요?

+3

우선 순위 오류가 발생했기 때문에 현재 코드에서 '공백 상황에서 string eq를 쓸모 없게 사용합니다.'라는 경고를 생성합니다 (경고를 사용해야하는 경우). 낮은 우선 순위'및'는 흐름 제어를 위해 설계되었습니다. 여기에'&&'를 사용해야합니다. – ysth

답변

7

and으로 시작하지 않음. 당신은 그것이주는 시각적 신호에 대해 상징적 인 연산자를 고집하고 싶습니다. 명명 된 연산자는 일반적으로 용어가있는 곳에서 찾을 수 있으며 andor이 일반적으로 흐름 제어에 사용됩니다. 그 힌트는 모두 여기에서 잘못되었으므로 그 힌트를주지 않으려 고합니다.

다음 배열은 읽기가 쉽습니다. 그 증거는 ==을 사용해야하는 곳에서 =을 사용한다는 것이 눈부시게 분명 해졌다는 것입니다.

my $is_compatible = ($array && grep $_ eq 'match', @$array) 
    && $my_num == 1 
    && $my_text eq 'yes'; 

하위를 사용하려면 다음을 수행하면됩니다.

sub is_compatible { 
    my ($array, $my_num, $my_text) = @_; 
    return 0 if !$array || !grep $_ eq 'match', @$array; 
    return 0 if $my_num != 1; 
    return 0 if $my_text ne 'yes'; 
    return 1; 
} 

이 두 가지 접근 방법을 사용하면 비슷한 것들이 비슷해 보이고 다른 것들이 다르게 보이므로 매우 효율적인 코드 스캐닝이 가능합니다.

3
sub is_compatible { 
    my $array_ref = shift; 
    defined($array_ref) 
     or return; 
    ref $array_ref eq ref [] 
     or return; 
    return unless grep $_ eq 'match', @$array_ref; 

    my $my_num = shift; 
    $my_num == 1 
     or return; 

    my $my_text = shift; 
    $my_text eq 'yes' 
     or return; 

    return 1; 
} 
+1

brian d foy를 훔친 형식의 일부입니다 :'ref $ array_ref eq ref []' – DVK

+3

'shift' 문을 하위에 혼동시키는 것이 헷갈 리지 않습니까? 모든 인수가 맨 위에 표시 될 수 있으면 서브 루틴의 의미를 알아내는 것이 훨씬 쉽다고 생각합니다. – simbabque