Perl ではハッシュ キーを引用符で囲むのが良い習慣ですか?

StackOverflow https://stackoverflow.com/questions/401556

  •  03-07-2019
  •  | 
  •  

質問

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

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

の中に Perl ベスト プラクティスの本、Damian Conway 著, 、アライメントがコードのセクションの読みやすさにどのように役立つかを示すこの例がありますが、ハッシュキーの引用については(私が見つけた本のどこにも)触れていません。

$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';
役に立ちましたか?

解決

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

ここでは、「引用されることもあれば、引用されないこともある」を使用する例を示します。慣例によりトラブルに巻き込まれる可能性があります:

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

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

他のヒント

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

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

どこでも単一引用符を使用することは、「防御的な」ように思えます。 Perlを知らない人々によって実行される練習。キーボードの消耗を抑えてPerlを学習します:)

このコメントを投稿している本当の理由は、大騒ぎではありません...他のコメントは、 + が" unquote"するという事実を見逃しているようです。裸語。つまり、次のように記述できます。

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

または:

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

つまり、 + shift は「シフト関数を呼び出す」という意味です。 shift は、「文字列「shift」」を意味します。

また、cperlモードはさまざまなケースすべてを正しく強調表示することを指摘します。解決しない場合は、IRCでpingを実行し、修正します:)

(ああ、もう1つ。 has 'foo' => ... のように、Mooseで属性名を引用します。これは、ステバンでの作業から選んだ習慣です。 、見た目はいいと思いますが...私のコードの残りの部分とは少し矛盾しています。たぶんすぐにやめるかもしれません。

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

(ちなみに、配列キーの引用符は PHPでのベストプラクティスであり、E_WARNINGsのトン数は言うまでもなく、それらを使用しないと深刻な結果を招く可能性があります。 。)

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

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

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

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

理由を聞かないでください、私がやる方法です:)

あなたができる最も重要なことは、常に、常に、常にすることだと思います:

use strict;
use warnings; 

この方法でコンパイラはセマンティックエラーをキャッチし、どちらの方法を選択しても、何かを間違えないようにします。

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

入力して読んで心配する必要が少ないからといって、引用符は付けません。自動引用されないキーがあるときは、余分な作業や混乱の価値がないように、ほとんどありません。おそらく、ハッシュキーの選択は私のスタイルに合わせて変更されたのかもしれませんが、これも同様です。エッジケースを完全に避けてください。

これは、デフォルトで" を使用するのと同じ理由です。補間したくない文字を使用するよりも、文字列の途中に変数を追加する方が一般的です。つまり、"あなたは私に$ 1000" を借りているよりも、 'こんにちは、私の名前は$ name' と書いていることが多いです。

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

$i{keys} = $a;
$i{values} = [1,2];
...

文字列の補間が必要な場合を除き、引用符を付けないことを好みます。そして、二重引用符を使用します。文字通りの数字に例えました。 Perlでは、実際に次のことができます。

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

しかし、誰もそれをしません。また、入力する文字がさらに2つ追加されているため、わかりやすくなりません。配列のスロット#3が特に必要な場合と同様に、%ENV から PATH エントリが必要な場合があります。単一引用符で囲むと、私が考える限り no の明瞭さが追加されます。

Perlがコードを解析する方法により、他の種類の「裸の単語」を使用できなくなります。ハッシュインデックス。

試す

$myhash{shift}

そして 'shift' キーの下のハッシュに保存されたアイテムを取得するだけです、あなたはこれをしなければなりません

$myhash{shift()}

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

さらに、 jEdit を使用します。これは、 ONLY ビジュアルエディタです(確認済み-emacs以外)、ハイライトをあなたで完全に制御できます。だから、私には二重に明らかだ。前者のように見えるものはすべて、KEYWORD3($ myhash)+ SYMBOL({)+ LITERAL2(shift)+ SYMBOL(})を取得します。さらに、次のようにフォーマットする可能性があります:

$myhash{ shift() }

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

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

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

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

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

これについて自分自身で疑問に思いました。特に、いくつかの失敗を見つけたときは

 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?';

私は常に引用符なしでこれらを使用してきましたが、一般的な間違いのほとんどを特定するため、strict と warning の使用を繰り返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top