2

オブジェクトのコレクションを格納するために使用できる perl の優れたモジュールを誰かが提案できますか?

それとも、ARRAY はほとんどのニーズを十分に満たしてくれるでしょうか?

更新: 各要素からコレクションレベルのプロパティを計算するような操作を実行できるようにしたいので、コレクションクラスを探しています。

このような多くの操作を実行する必要があるため、個々のオブジェクトによって拡張できるクラスを作成することもできます。このクラスは明らかに配列 (またはハッシュ) で動作します。

4

8 に答える 8

4

より複雑な構造のコレクション モジュールがありますが、Perl では配列、スタック、およびリストに配列を使用するのが一般的なスタイルです。Perl には、配列をスタックまたはリストとして使用するための関数が組み込まれています。プッシュ/ポップ、シフト/シフト解除、スプライス (途中で挿入または削除)、および反復のための foreach 形式です。

Perl にはハッシュマップと呼ばれるマップもあり、これは Python の Dictionary に相当し、単一のキーと単一の値を関連付けることができます。

Perl 開発者は、必要なものを構築するためにこれら 2 つのデータ構造を構成することがよくあります。複数の値が必要ですか? ハッシュテーブル (マップ) の値の部分に配列参照を格納します。ツリーも同様の方法で構築できます。一意のキーが必要な場合は、複数レベルのハッシュマップを使用するか、ネストされた配列参照を使用しない場合です。

Perl のこれら 2 つのプリミティブ コレクション型にはオブジェクト指向 API はありませんが、それでもコレクションです。

CPAN を見ると、他のオブジェクト指向データ構造を提供するモジュールが見つかる可能性がありますが、それは本当に必要に応じて異なります。リスト、スタック、またはマップ以外に必要な特定のデータ構造はありますか? 特定のデータ構造について質問している場合は、より正確な回答 (特定のモジュールなど) が得られる可能性があります。

言い忘れましたが、さまざまな言語の小さなコード例を探しているなら、PLEAC (Programming Language Examples Alike Cookbook) が適切なリソースです。

于 2008-09-24T20:36:24.107 に答える
3

Michael Carman のコメントに賛成します。ハッシュまたは連想配列を意味する場合は、「ハッシュマップ」または「マップ」という用語を使用しないでください。特に Perl に map 関数がある場合。それは物事を混乱させるだけです。

そうは言っても、Kyle Burton の回答は基本的に健全です。通常は、ハッシュまたは配列、または 2 つの混合物で構成される複雑な構造で十分です。Perl は OO を受け入れますが、それを強制しません。大まかに定義されたデータ構造は、必要なものには十分である可能性があります。

それができない場合は、「各要素からコレクションレベルのプロパティを計算する」という意味をより正確に定義してください。また、Perl には map や grep などの関数型プログラミングを可能にするキーワードがあることを覚えておいてください。

my $record = get_complex_structure();
# $record = {
#    'widgets' => {
#        name => 'ACME Widgets',
#        skus => [ 'WIDG01', 'WIDG02', 'WIDG03' ],
#        sales => {
#            WIDG01 => { num => 25, value => 105.24 },
#            WIDG02 => { num => 10, value => 80.02 },
#            WIDG03 => { num => 8,  value => 205.80 },
#        },
#    },
#    ### and so on for 'grommets', 'nuts', 'bolts' etc.
# }

my @standouts =
    map { $_->[0] }
    sort {
        $b->[2] <=> $a->[2] 
     || $b->[1] <=> $a->[1]
     || $record->{$a->[0]}->{name} cmp $record->{$b->[0]}->{name}
    }
    map {
        my ($num, $value);
        for my $sku (@{$record->{$_}{skus}}) {
            $num   += $record->{$_}{sales}{$sku}{num};
            $value += $record->{$_}{sales}{$sku}{value};
        }
        [ $_, $num, $value ];
    }
    keys %$record;

後ろから前に読むと、この特定のシュヴァルツ変換は次の 3 つのことを行います。

3) $record へのキーを取得し、この任意の構造で定義された SKU を調べて、トランザクションの総数と合計値を計算します。キー、トランザクション数、および合計値を含む匿名配列を返します。

2) 次のブロックは、多数の arrayref を受け取り、それらをソートします。 a) まず、合計値を数値的に降順で比較します。b) 値が等しい場合は、取引数を数値的に降順に比較することにより、c) それが失敗した場合は、この注文に関連付けられた名前で無意識的にソートします。

1) 最後に、ソートされたデータ構造から $record へのキーを取得し、それを返します。

やりたいことをするために別のクラスを設定する必要はないかもしれません。

于 2008-09-25T01:31:37.687 に答える
2

通常は @array または %hash を使用します。

それらによって提供されていない機能を探していますか?

于 2008-09-24T20:32:52.773 に答える
1

オブジェクトへのアクセス方法に基づいて決定してください。それらを配列にプッシュする、インデックスを作成する、それらをポップ/シフトオフすることが機能する場合は、配列を使用します。それ以外の場合は、何らかのキーでそれらをハッシュするか、ニーズを満たすオブジェクトのツリーに編成します。オブジェクトのハッシュは、Perl で物事を行うための非常にシンプルで強力な高度に最適化された方法です。

于 2008-09-24T20:31:48.267 に答える
1

Perl 配列は、追加、サイズ変更、ソートなどを簡単に実行できるため、ほとんどの「コレクション」のニーズには十分対応できます。より高度なものが必要な場合は、一般にハッシュで十分です。実際に必要になるまで、コレクション モジュールを探しに行くことはお勧めしません。

于 2008-09-24T20:33:13.647 に答える
0

それは大きく依存します。Sparse Matrixモジュール、いくつかの形式のpersistence 新しいスタイルの OOなどがあります。ほとんどの人は、データ構造に関する特定の問題に答えるためにperldataperllolperldscを操作するだけです。

于 2008-09-24T20:52:27.953 に答える
0

私はARRAYまたはHASHに固執します。

 @names = ('Paul','Michael','Jessica','Megan');

my %petsounds = ("cat" => "meow",
             "dog" => "woof",
             "snake" => "hiss");

ソース

于 2008-09-24T20:29:46.243 に答える
0

配列またはハッシュは、オブジェクトのコレクションを格納できます。特定の方法でクラスを操作したい場合は、クラスの方が優れている可能性がありますが、適切な推奨を行う前に、それらの方法が何であるかを教えていただく必要があります。

于 2008-09-24T20:35:43.623 に答える