• ベストアンサー

ハッシュキーの内容について

こんばんは。perlをはじめて一ヶ月あまりの初心者です。 また疑問に思うことが見つかり、質問させていただきました。 以下のようなコードがあります。 ----------------------------------------- my @array = ( 'a','b','c'); my %hash; for (@array) {   $hash{$_}{OK} = 1;   $hash{$_}{WAVE} = 2;   $hash{$_}{Perl} = 3; } print $hash{a}->{OK}; print $hash{"b"}->{WAVE}; print $hash{c}->{"Perl"}; ----------------------------------------- 1、2、3を格納するときなのですが、 ハッシュのキーになる値(OK、WAVE、Perl)は、 ダブルクォートや、シングルクォートで囲っていません。 でも、エラーも発生せず、普通に実行できてしまいます("123"を表示します)。 ハッシュのキーは、 "OK","WAVE"や、'Perl'のように ダブルクォートや、シングルクォートで 囲む必要はないのでしょうか?? C言語みたいに厳密に型が決まっているわけではないので、 OKでも"OK"でもよいのかなー、という思いはあるのですが、、、 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

少なくとも, 「英数字のみからなる」キーであればクォートする必要はありません. 言語仕様として, そうなっています.

ijhnb6543f
質問者

お礼

Tacosan様、こんばんは。 なるほど。「英数字のみからなるキー」であればよいのですね。 ハッシュリファレンスを自動生成するときなど、 「キーを取り出したりせず一意になるためにしか使わない」 の場合などを考えると、いちいちクォートをつける必要はなさそうですね。 ありがとうございました☆

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

{...} の中と => の左オペランドでは「構文として」bare word が使えます. これは言語仕様上も想定されているものであり, use strict 'subs' のもとでも利用可能です. これに対し, その他の場面で出てくるときは「perl がよきにはからってくれている」だけで, use strict 'subs' を付けるとエラーになります. 従って, この 2つを混同してはいけません>#3.

ijhnb6543f
質問者

お礼

Tacosan様、重ねてご回答ありがとうございます。 perlは色んな書き方がある、とは聞いていましたが、 言語仕様としても、思った以上に複雑なものがあるのですね。 use strict 'subs'については、全然考慮していませんでした。 perlを使うようになって間もないので、今回は、 「英数字のみからなるキーであればつけなくても大丈夫」 「でも、古いPerlではエラーになるかもしれないから、つけておいたほうが無難」 と覚えておきます。 詳しいことはだんだん分かってくると思うので。 今後、いきなりクォートなしのキーが出てきても、大丈夫です。 ありがとうございました☆

  • pick52
  • ベストアンサー率35% (166/466)
回答No.3

Perlの言語仕様として単なる英数字のみであればクオートする必要は ないのですがそれでも非推奨だと思うので基本的にはクオートする ようにした方がいいです。 # 半角英数字のみの場合はクオートしなくても正常に動作する my $test = test; print $test; exit; そうしないと、いざというときにエラーが発生したりしてなぜだと 結構、悩むことがあります。(^_^; キーに変数だけを指定するならしなくてもいいでしょう

ijhnb6543f
質問者

お礼

pick52様、こんばんは。 本で勉強していたのですが、 いきなりクォートなしのキーが出てきてびっくりしました。 基本的にはクォートするようにしたほうがよいみたいですね。 ありがとうございました☆

回答No.2

あまり記憶が定がではないですが、古いPerl(Perl4)などは'foo'、"baa"などとしないとエラーになります。 しかし最近のPerl(Perl5以上)ではあっても無くても構いません。 これはPerlの仕様が変更になったことに伴うものです。 古いPerlでも使うのであれば付けないといけませんが、古いものは絶対に使わないのであれば無くてもいいです。

ijhnb6543f
質問者

お礼

buffalomasa様、こんばんは。 ActivePerl5.8.6を使っています。 自分のパソコンで使うだけならよいのですが、 誰かが使うときのことを考えると、 クォートをつけておいたほうが親切ですよね。 Perlのバージョンで仕様が違うことにも気が付くことができました。 ありがとうございました☆