32

定数をハッシュキーとして使用する方法はありますか?

例えば:

use constant X => 1;

my %x = (X => 'X');

上記のコードは、キーとして1ではなく、キーとして「X」を使用してハッシュを作成します。一方、定数Xの値をキーとして使用したいと思います。

4

9 に答える 9

49

use constant実際には定数サブルーチンを作成します。

あなたが望むことをするために、あなたは明示的に潜水艦を呼ぶ必要があります:

use constant X => 1;

my %x = ( &X => 'X');

また

use constant X => 1;

my %x = ( X() => 'X');
于 2008-09-18T20:57:00.840 に答える
19

もう 1 つのオプションは、Damian Conway による Perl のベスト プラクティスの推奨に従って、use constant プラグマを使用せず、読み取り専用にフリップすることです。

定数ハッシュ参照はハッシュへの定数参照にすぎないことに気付いた後、しばらく前に切り替えましたが、ハッシュ内のデータについては何もしません。

readonly 構文は「通常の外観」の変数を作成しますが、実際には定数または読み取り専用を強制します。他の変数と同じようにキーとして使用できます。


use Readonly;

Readonly my $CONSTANT => 'Some value';

$hash{$CONSTANT} = 1;

于 2008-09-18T21:11:07.547 に答える
15

問題は、=>がその前の単語を自動的に引用する魔法のコンマであるということです。したがって、あなたが書いたものは('X'、'X')と同等です。

最も簡単な方法は、コンマを使用することです。

my %x = (X, 'X');

または、さまざまな句読点を追加して、=>の前に単純な単語がないようにすることもできます。

my %x = ( X() => 'X' );
my %x = ( &X => 'X' );
于 2008-09-18T20:57:32.650 に答える
10

$hash{CONSTANT()}またはを使用$hash{+CONSTANT}して、ベアワード引用メカニズムが機能しないようにします。

差出人:http ://perldoc.perl.org/constant.html

于 2008-09-18T21:00:09.243 に答える
6

他のほとんどの人があなたの質問にうまく答えています。これらをまとめると、問題の完全な説明と推奨される回避策が作成されます。問題は、Perl プラグマの "use constant" が実際に現在のパッケージにサブルーチンを作成することです。その名前はプラグマの最初の引数であり、値は最後の引数です。

Perl では、サブルーチンが宣言されると、括弧なしで呼び出すことができます。

「定数」が単なるサブルーチンであることを理解すると、それらが文字列に補間されない理由と、左側の引数を引用する「太いコンマ」演算子「=>」が、文字列を渡したと見なす理由がわかります (他のビルドを試してみてください-time() や keys() のような関数では、楽しみのためにファット コンマを使用する場合もあります)。

幸いなことに、括弧やアンパサンド記号などの明示的な句読点を使用して定数を呼び出すことができます。

ただし、質問があります。なぜ、ハッシュ キーに定数を使用しているのですか?

この方向に導く可能性のあるいくつかのシナリオを考えることができます。

  1. ハッシュに含めることができるキーを制御する必要があります。

  2. これらが後で変更された場合に備えて、キーの名前を抽象化したい

番号 1 の場合、定数はおそらくハッシュを保存しません。代わりに、オブジェクトにのみ表示されるハッシュを設定するパブリック セッターとゲッターを持つクラスを作成することを検討してください。これは非常に Perl に似ていないソリューションですが、非常に簡単に実行できます。

番号 2 の場合でも、クラスを強く推奨します。ハッシュへのアクセスが適切に定義されたインターフェースを通じて規制されている場合、クラスの実装者だけがハッシュ キー名を正しく取得する責任があります。その場合、定数を使用することはまったくお勧めしません。

これがお役に立てば幸いです。お時間をいただきありがとうございます。

于 2008-09-18T22:00:14.917 に答える
5

プラグマは、use constant引数を取らないようにプロトタイプ化されたサブルーチンを作成します。これは C スタイルの定数のように見えますが、実際には定数値を返すサブルーチンです。

(=>太いコンマ) は、$hash{key} 表記と同様に、裸の単語の場合、左側のオペランドを自動的に引用します。

定数名の使用が裸の単語のように見える場合、引用メカニズムが作動し、その値の代わりにその名前がキーとして取得されます。これを防ぐには、裸語にならないように使用法を変更します。例えば:

use constant X => 1;
%hash = (X() => 1);
%hash = (+X => 1);
$hash{X()} = 1;
$hash{+X} = 1;

初期化子では、代わりにプレーンなコンマを使用することもできます:

%hash = (X, 1);
于 2008-09-18T21:16:26.287 に答える
2

=>演算子は、qw()と同じように、左側を「文字列」として解釈します。

使ってみてください

my %x = ( X, 'X');
于 2008-09-18T20:58:17.187 に答える
2

1つの方法は、Xを(X)としてカプセル化することです。

my %x ( (X) => 1 );

別のオプションは、「=>」を廃止し、代わりに「」を使用することです。

my %x ( X, 1 );
于 2008-09-18T20:58:25.127 に答える
1

@shelfoo にコメントします (コメントを直接追加できるほど評判は高くありません!)

Damian Conway による Perl Best Practices については完全に同意します... 強くお勧めします。

ただし、社内スタイル ガイドに PBP を使用する予定がある場合は、有用な「正誤表」であるPBP モジュールの推奨事項の解説をお読みください。

于 2008-09-22T11:33:06.987 に答える