2009-07-24 2 views
4

어떤 접근법이 더 많은지 (1) 관용적 Perl, (2) 능률, (3) "명확한"어느 쪽인지를 결정할 수 없습니다.Perl에서 더 나은 점은 해시 참조 배열 또는 "플랫"해시 목록입니다.

코드로 설명하겠습니다. 첫째, 나는

sub something { 
    ... 
    push (@names, "Foo"); 
    $sizes{Foo} = 10; 
    $volumes{Foo} = 100; 
    ... 
    return (\@names, \%sizes, \%volumes); 
} 

모두 본질적으로 같은 일을 할 수있는,

sub something { 
    ... 
    $ref->{size} = 10; 
    $ref->{name} = "Foo"; 
    $ref->{volume} = 100; 
    push (@references, $ref); 
    ... 
    return @references; 
} 

을하거나 할 수 있습니다. 중요한 것은 주문을 유지해야하기 때문에 배열이 필요하다는 것입니다.

알고 계시지 만, 항상 여러 가지 방법이 있지만 여전히이 두 가지 방법 중 어느 것을 선호하십니까?

+1

과제를 세로로 정렬하고 붙여 넣을 수 있습니까? 그리고 당신의 반환에 괄호를 제거하고 밀어?그것은 OP를 훨씬 더 명확하게 할 것입니다. –

답변

10

something과 같은 의미가없는 용어로 생각하지 말고 구체적인 문제를 생각해보십시오. 이 경우 name, sizevolume 속성을 가진 객체의 목록을 반환하는 것처럼 보입니다. 그렇게 생각하면 두 번째 방법을 고려해야 할 이유가 없습니다.

나중에 문제가 발생할 경우 최적화를 생각할 수 있지만 그래도 데이터 구조를 분해하는 것보다 Memoize에서 더 많은 것을 얻을 수 있습니다. 내가 추천합니다

한 효율 향상이 서브 루틴에서 참조를 반환하는 것입니다 :

sub get_objects { 
    my @ret; 

    while ('some condition') { 
     # should I return this one? 
     push @ret, { 
      name => 'Foo', 
      size => 10, 
      volume => 100, 
     }; 
    } 

    return \@ret; 
} 
+1

감사합니다. 나는 구체적인 용어가 단지 아주 간단한 질문을 복잡하게 만들었지 만. Btw, 제목, 링크, HTML 소스 및 키워드가있는 HTML 페이지 목록을 반환하고 싶습니다. –

5

나는 이전보다 훨씬 좋습니다. 데이터 (크기, 이름, 볼륨)를 하나의 "패킷"으로 묶어 훨씬 더 읽기 쉬운 코드로 만듭니다.

2

함께하여 관련 데이터를 유지합니다. 커다란 병렬 배열을 만드는 유일한 이유는 강요 당하기 때문입니다. 당신은 속도와 메모리 사용에 대해 우려하는 경우

, 당신은 당신의 이름 필드에 액세스하기 위해 일정한 배열 인덱스를 사용할 수 있습니다 : 나는 또한 코드를 읽기 쉽게 만드는 약간의 공백을 추가 한

use constant { SIZE => 0, NAME => 1, VOLUME => 2, }; 

sub something { 
    ... 

    $ref->[SIZE] = 10; 
    $ref->[NAME] = "Foo"; 
    $ref->[VOLUME] = 100; 

    push @references, $ref; 

    ... 
    return @references; 
} 

.

유효성 검사 규칙 및/또는 심층 데이터 구조가있는 매개 변수가 많은 경우 데이터에 대한 논리를 데이터에 연결하여 코드를 단순화하는 개체를 찾는 경향이 있습니다. 물론 OOP는 스피드 페널티를 요구하지만, 나는 거의 문제가되지 않는 것을 보았다.

OOP를 빠르고 오랫동안 사용하기 위해 Class :: Struct를 사용합니다. 많은 결함이 있습니다. 형식 검사가 필요한 상황에서 무스 나 마우스를 사용합니다 (메모리 나 시작 속도가 큰 문제 일 때).

0

두 가지 방법 모두 다른 문제에 유용 할 수 있습니다. 항상 모든 정보에 액세스하려면 함께 보관하십시오. 예를 들어, 귀하의 경우 웹 페이지의 이름, 제목 및 크기를 추적하고자합니다. 아마도 세 가지 작업을 동시에 수행 할 것이므로 해시 참조 배열로 유지하십시오.

다른 경우에는 별도로 사용하는 다른 항목으로 데이터를 분리하여 다른 열과 독립적으로 조회 할 수 있습니다. 이 경우 별도의 해시가 적합 할 수 있습니다.

관련 문제