旧燈明日記

自分史と英語学習と映画感想と健康志向と警備一般

Perlの謎(その1):変数等の頭文字って何を意味するの?

他言語、特にオーソドックスなcobol,c,java,vb等の人がPerlをやり始めると謎だらけで悩むことになりますね。
そんな人のために、僭越ながら私が謎を解き明かしていきますよ! Perlerの方は温かく見守ってくださいね(^o^)

◆変数等の頭文字って何を意味するの?

Perlをやり始めると変数等の頭文字($,@,%,&,*,何も無し)が気になります。


『$』が付くシンボルは、スカラー変数で、数値や文字列など何でも入る・・・VBで言えば、variant型のような変数です。
『$』はScalarの『S』に似ているので、スカラー変数を表します。


『@』が付くシンボルは、配列変数で、配列の要素はスカラー変数と同じで、何でも入る。
『@』はarrayの『a』に似ているので、配列変数を表します。


『%』が付くシンボルは、ハッシュ変数で、ハッシュはkeyとvalueを対で持っていて、valueはスカラー変数と同じで、何でも入る。
『%』はkeyとvalueの対を表していて、ハッシュ変数を表します。


『&』が付くシンボルは、サブルーチンで、実は『&』を頭に付けるより、尾に『()』をつけてサブルーチンを明示する方が多いです。
『&』はSubの『S』に似ているので、サブルーチン(これは自信がない)を表します。
(モダンPerlでは、『&』は付けないとのことです。右を参照のこと『第124回 サブルーチンの頭に&は普通つけない』)
『*』が付くシンボルは、型グロブで、頭文字以外同名のシンボルすべてを表します。
『*』と言えば、ワイルドカードですね。


何もつかないシンボルは、ベアワードで、ファイルハンドル、引数のない組み込み関数、ヒアドキュメントの終端値、ラベル、単なる文字列などなど・・・。

◆ファニー文字

ちなみに、これらの頭文字のことをPerl では「ファニー文字(funny character)」とよんでいます。
実はファニー文字を使うことにより、将来使われるであろう予約語やキーワードとかぶることがありません。
他の言語では、かぶる可能性があり、かぶった時に過去の資産が使えなくなるのです。
つまり、Perlでは、ファニー文字を使うことにより、過去の資産が使えなくなることが無いのです。

◆サンプル

$hoge = 123;                      # スカラー変数
@hoge = (1, 2, 3);                # 配列変数
%hoge = (a => 1, b => 2, c => 3); # ハッシュ変数

print "-----&hoge------------\n";              
&hoge;                            # サブルーチン
print "-----&foox(*hoge)------\n";              
&foox(*hoge);

sub hoge {
   print "$hoge", "\n";                   # スカラー変数
   print "$hoge[0]$hoge[1]$hoge[2]", "\n";# 配列変数
   print "$hoge{a}$hoge{b}$hoge{c}", "\n";# ハッシュ変数
}                                         
sub foox {
   (*foo) = @_;
   print "$foo", "\n";                 # スカラー変数
   print "$foo[0]$foo[1]$foo[2]", "\n";# 配列変数
   print "$foo{a}$foo{b}$foo{c}", "\n";# ハッシュ変数
   print "-----&foo--------------\n";              
   &foo;                               # サブルーチン
}

◆実行結果

C:\perltest>perl sysbol.pl
-----&hoge------------
123
123
123
-----&foo(*hoge)------
123
123
123
-----&foo--------------
123
123
123

上記サンプルは、型グロブと各変数の関係を示すため、すべてグローバル変数になっています。
しかし、モダンPerlではなるべくグローバル変数は使わず、myでローカル変数にして処理するのが推奨です。
また、サブルーチンの『&foo;』も『foo();』の記述の方が推奨です。

◆謎シリーズ(予告)

  • 謎(その2):比較先がない比較と代入文がない代入
  • 謎(その3):subのデフォルトリターン値
  • 謎(その4):コンテキストで意味が変わる関数
  • 謎(その5):構造体がないデータ構造
  • 謎(その6):foreach文がfor文に
  • 謎(その7):mマッチ演算子の区切り文字
  • 謎(その8):正規表現の記憶$1〜とは
  • 謎(その9):単独shift
  • 謎(その10):blessとは何か