38

Perlでハッシュを使用するときにキーを引用するのは良い考えですか?

私は非常に大規模なレガシー Perl コード ベースに取り組んでおり、Damian Conway がPerl Best Practicesで提案した多くのベスト プラクティスを採用しようとしています。ベスト プラクティスは常にプログラマーにとって厄介な問題であることはわかっていますが、炎上戦争を始めることなく、これについて良い答えが得られることを願っています。また、これは些細な問題であるため、多くの人が議論しないであろうこともわかっていますが、このコード ベースを進めながら、従うべきガイドラインのしっかりしたリストを取得しようとしています。

Damian Conway による Perl Best Practices の本には、アラインメントがコードのセクションの読みやすさにどのように役立つかを示すこの例がありますが、ハッシュキーを引用することについては (私が見つけることができる本のどこにも) 言及されていません。

$ident{ name   } = standardize_name($name);
$ident{ age    } = time - $birth_date;
$ident{ status } = 'active';

むき出しの言葉を使用していないことを強調するために、これを引用符で書いた方がよいのではないでしょうか?

$ident{ 'name'   } = standardize_name($name);
$ident{ 'age'    } = time - $birth_date;
$ident{ 'status' } = 'active';
4

13 に答える 13

36

引用符なしの方が良いです。{} 内にあるため、裸の単語を使用していないことは明らかです。さらに、読みやすく、入力しやすくなっています (記号が 2 つ少ない)。しかし、もちろん、これはすべてプログラマーに依存します。

于 2008-12-30T21:30:56.213 に答える
33

定数文字列のハッシュ キーを指定するときは、常に (一重) 引用符を使用する必要があります。たとえば、 $hash{'key'} この問題について考える必要がなくなり、一貫したフォーマットが得られるため、これが最良の選択です。キーにハイフン、スペース、またはその他の特殊文字が含まれている場合は、引用符を忘れずに追加する必要があります。このような場合は引用符を使用する必要があり、フォーマットの一貫性が失われます (引用されていない場合もあれば、引用されている場合もあります)。引用符で囲まれたキーは、エディターによって構文が強調表示される可能性も高くなります。

以下は、「ときどき引用し、それ以外のときは引用しない」という規則を使用すると、問題が発生する可能性がある例です。

$settings{unlink-devices} = 1; # I saved two characters!

これは の下で問題なくコンパイルuse strictされますが、実行時に期待することはできません。ハッシュ キーは文字列です。文字列は、その内容に応じて適切に引用符で囲む必要があります。リテラル文字列には一重引用符、変数の補間を許可するには二重引用符を使用します。ハッシュキーを引用します。これは最も安全な規則であり、理解して従うのが最も簡単です。

于 2008-12-31T02:11:27.473 に答える
12

ハッシュキーを一重引用符で囲むことはありません。{} は、特別な場合 (+ と二重引用符) を除いて、基本的に引用符と同じように機能することを知っています。私の編集者もこれを知っており、意図したとおりに実行したことを確認するために、色に基づいた手がかりをいくつか提供してくれます。

どこでも一重引用符を使用することは、Perl を知らない人が行う「防御的な」慣行のように思えます。キーボードの摩耗を減らし、Perl を学びましょう :)

暴言が邪魔にならないように、私がこのコメントを投稿している本当の理由は...他のコメントは、+裸の単語を「引用解除」するという事実を見逃しているようです。つまり、次のように記述できます。

sub foo {
    $hash{+shift} = 42;
}

また:

use constant foo => 'OH HAI';
$hash{+foo} = 'I AM A LOLCAT';

したがって、+shift「シフト関数を呼び出す」ことをshift意味し、「文字列 'shift'」を意味することは明らかです。

また、cperl-mode がさまざまなケースをすべて正しく強調表示することも指摘します。そうでない場合は、IRC で私に ping を送信してください。修正します :)

(ああ、もう 1 つ。Moose では、 のように属性名を引用していますhas 'foo' => ...。これは、stevan と一緒に仕事をしたときに身につけた習慣です。見栄えは良いと思いますが、他の部分とは少し矛盾しています。私のコード.多分私はすぐにそれをやめます.)

于 2009-01-11T01:35:34.917 に答える
10

Larry Wall は引用符のないハッシュ キーに構文レベルの注意を払い、ベスト プラクティス以外の理由がないことを確認しました。引用符を気にしないでください。

(ちなみに、配列キーの引用符PHP でのベスト プラクティスであり、大量の E_WARNING は言うまでもなく、引用符を使用しないと深刻な結果が生じる可能性があります。Perl では問題ありません!= PHP では問題ありません。)

于 2008-12-30T21:36:16.437 に答える
6

これにはベストプラクティスはないと思います。個人的には、次のようにハッシュ キーで使用します。

$ident{'name'} = standardize_name($name);

ただし、矢印演算子の左側では使用しないでください。

$ident = {name => standardize_name($name)};

理由を聞かないでください、それは私のやり方です:)

あなたができる最も重要なことは、常に、常に、常に:

use strict;
use warnings; 

こうすることで、コンパイラがセマンティック エラーをキャッチしてくれるので、どの方法を選択しても、何かをタイプミスする可能性が低くなります。

そして、2 番目に重要なことは、一貫性を保つことです。

于 2008-12-31T00:44:25.670 に答える
5

タイプしたり、読んだり、心配したりすることが少ないという理由だけで、引用符は付けません。自動引用されないキーを持っている場合は、余分な作業と混乱のすべてに値しないように、ほとんどありません。おそらく、ハッシュ キーの選択が私のスタイルに合うように変更されたのでしょう。エッジ ケースを完全に回避します。

これは、私"がデフォルトで使用するのと同じ理由です。補間したくない文字を使用するよりも、文字列の途中で変数をプロップする方が一般的です。つまり、私は よりも頻繁に書い'Hello, my name is $name'てい"You owe me $1000"ます。

于 2009-01-03T21:50:14.773 に答える
4

少なくとも、引用符は、それほど完璧ではないエディターで予約語を強調表示する構文を防ぎます。チェックアウト:

$i{keys} = $a;
$i{values} = [1,2];
...
于 2008-12-31T00:00:11.560 に答える
3

文字列補間が必要な場合を除いて、引用符なしで使用することをお勧めします。そして、二重引用符を使用します。私はそれを文字通りの数字に例えます。Perlでは、実際に次のことが可能になります。

$achoo['1']  = 'kleenex';
$achoo['14'] = 'hankies';

しかし、誰もそれをしません。また、入力する文字をさらに2つ追加するだけなので、わかりやすくすることはできません。配列内のスロット#3が特に必要な場合と同様に、からのPATHエントリが必要な場合もあり%ENVます。それを一重引用することは、私に関する限り、明確さを追加しません。

Perlがコードを解析する方法により、ハッシュインデックスで他のタイプの「ベアワード」を使用することは不可能になります。

試す

$myhash{shift}

'shift'キーの下のハッシュにアイテムを保存するだけです。これを行う必要があります

$myhash{shift()}

最初の引数でハッシュのインデックスを作成することを指定するため。

さらに、私はjEditを使用しています。これは、ハイライト完全に制御できる唯一のビジュアルエディター(emacsを除く)です。ですから、それは私には二重に明らかです。前者のように見えるものはすべて、KEYWORD3($ myhash)+ SYMBOL({)+ LITERAL2(shift)+ SYMBOL(})を取得します。閉じているカーリーの前にパランセシスがある場合は、KEYWORD3 + SYMBOL + KEYWORD1 + SYMBOL(()})を取得します。さらに、私も次のようにフォーマットします。

$myhash{ shift() }
于 2008-12-31T04:22:56.897 に答える
3

引用符で行きます!それらは構文を視覚的に分割し、より多くのエディターが構文の強調表示でそれらをサポートします (ちょっと、Stack Overflow でさえ引用バージョンを強調表示しています)。また、編集者が引用を終了したことを確認することで、タイプミスに早く気付くと思います。

于 2008-12-30T23:55:44.410 に答える
2

ベアワードでは許可されていない特殊文字を使用できるため、引用符の方が適しています。引用符を使用することで、母国語の特殊文字をハッシュ キーで使用できます。

于 2008-12-30T22:50:29.237 に答える
2

キーの前に " -" (マイナス記号)を付けることもできますが、キーの先頭-に " " が追加されることに注意してください。私のコードのいくつかから:

$args{-title} ||= "Intrig";

一重引用符、二重引用符、および引用符なしの方法も使用します。すべて同じプログラムで:-)

于 2008-12-31T05:08:45.103 に答える
2

特に私がいくつかの過ちを犯したことに気付いたとき、私はこれについて自分自身で疑問に思いました:

 use constant CONSTANT => 'something';
 ...
 my %hash = ()
 $hash{CONSTANT}          = 'whoops!';  # Not what I intended
 $hash{word-with-hyphens} = 'whoops!';  # wrong again 

私が現在行っていることは、リテラル キーの少なくとも 1 つがそれらを必要とする場合、ハッシュごとに普遍的に引用符を適用することです。定数で括弧を使用します。

 $hash{CONSTANT()} = 'ugly, but what can you do?';
于 2009-01-01T10:23:08.980 に答える
0

私は常に引用符なしでそれらを使用してきましたが、strict と warnings の使用は、よくある間違いのほとんどを指摘しているためです。

于 2008-12-31T06:43:55.863 に答える