web-dev-qa-db-ja.com

Perlでセットを表すにはどうすればよいですか?

Perlでセットを表現したいと思います。私が通常行うことは、いくつかのダミー値を持つハッシュを使用することです。例えば:

_my %hash=();
$hash{"element1"}=1;
$hash{"element5"}=1;
_

次に、if (defined $hash{$element_name})を使用して、要素がセット内にあるかどうかを判断します。

これは一般的な方法ですか?これを改善するための提案はありますか?

また、definedまたはexistsを使用する必要がありますか?

ありがとうございました

36
David B

CPANの多くのSetモジュールの1つを使用してください。あなたの例から判断すると、 Set::Light または Set::Scalar が適切と思われます。


このアドバイスは、CPANプロの通常の議論(相乗効果の可能性は無視)で守ることができます。

  1. 現在と将来の両方で、ルックアップが必要なすべてであることをどのようにして知ることができますか?経験によれば、 最も単純なプログラムでも拡張およびスプロール されます。モジュールを使用すると、それが予想されます。
  2. APIは、異なる抽象化レベルでの部分的な問題について考えることができるため、アドホックな実装よりも、メンテナンス、または一般的にコードを読んで理解する必要がある人にとってはるかに優れています。
  3. これに関連して、オーバーヘッドが望ましくないことが判明した場合は、間接参照を削除するか、データ構造とソースコードをペアリングすることで、モジュールからシンプルに簡単に移行できます。しかし、その一方で、より多くの機能が必要になると、逆の方法で達成するのがやや難しくなります。
  4. CPANモジュールはすでにテストされており、ある程度は完全にデバッグされています。おそらくAPIも時間の経過とともに改善されましたが、アドホックでは、 プログラマーは通常、最初に思いついた設計を実装します

まれに、最初にモジュールを選択することが間違った選択であることが判明します。

14
daxim

はい、その方法でハッシュセットを構築することは一般的なイディオムです。ご了承ください:

my @keys = qw/a b c d/;
my %hash;
@hash{@keys} = ();

undefは占有するスペースが大幅に少ないため、1を値として使用するよりも望ましい方法です。これはまた、exists(とにかく正しい選択です)を使用することを強制します。

49
Chas. Owens

それは私がいつもそれをした方法です。私はexistsではなくdefinedを使用する傾向がありますが、どちらもこのコンテキストで機能するはずです。

1