2009-07-24 14 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,size、およびvolumeの属性を持つオブジェクトのリストを返すようです。このように考えると、2番目の方法を検討する理由はありません。

問題が発生した場合は後で最適化を考えることはできますが、それでもデータ構造を分解する場合よりも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

私は大幅に前者を好む。これは、データ(サイズ、名前、ボリューム)の1つの "パケット"をまとめて、より読みやすいコードを作成します。

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を使用します。タイプチェックが必要な状況では、私はMooseやMouseを使用します(メモリや起動速度が大きな問題である場合)。

0

両方の方法が異なる問題に役立つ場合があります。すべての情報に常にアクセスする場合は、一緒に保管してください。たとえば、あなたのケースでは、Webページの名前、タイトル、およびサイズをトラッキングする必要があります。おそらく、これらの3つのものすべてを同時に使用しているので、それらをハッシュリファレンスの配列としてまとめてください。

別々に使用する別のものにデータを分割し、他の列とは独立して検索したい場合もあります。そのような場合、別々のハッシュが意味をなさないかもしれません。

関連する問題