高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

リファレンスの操作

 Perlは記号だらけなので、気を抜いているとすぐ何がなんだか分からなくなります。
対応する括弧を強調表示するエディタを使えば見やすかったかな…(^_^;
サブルーチンに配列やハッシュリストを渡したい場合、リファレンスで渡さなければならないようですが、この扱いは結構複雑です。

 ハッシュ。ハッシュは、()で囲むと、実体として宣言できるようです

  $const = ('VERSION'   => $INFO{'version'},
          'AUTHORLINK'=> 'link',
          'SELFFILE'  => $SELFFILE,
          'NOWPROFILE'=> $FORM{'profile'},
          'NOWMODE'   => $FORM{'mode'},
          %PROFILES
          );

 ハッシュを直接返すサブルーチンなんかは、これを使ってハッシュを返します。

  return ('VERSION'   => $INFO{'version'},
          'AUTHORLINK'=> 'link',
          'SELFFILE'  => $SELFFILE,
          'NOWPROFILE'=> $FORM{'profile'},
          'NOWMODE'   => $FORM{'mode'},
          %PROFILES
          );

 で、上でも出てますが、他のハッシュを連結するときは、普通に要素の一つとして書く…と。
{}で宣言すると、無名ハッシュのリファレンスとなります。まあ、リテラルみたいな感じに使えるみたい。

      &chielib::expandTemplate(\@lines, 
        {'bookmenu'  => $templates, 
         'lastupdate' => &getFormattedDate( ( stat($FORM{'profile'}) )[9] ),
         %templateHash});

サブルーチンに直接渡すときは、こっちを使うと良いみたい*1

 また、Perlでは配列はC#で言うジャグ配列――配列の配列みたいな宣言しか出来ず、結果、配列のハッシュ、ハッシュの配列 などと言ったことも出来ます(複雑なのでしない方が良いかもしれませんが…)。まあ、オブジェクト指向言語になれていらっしゃる方なら、配列=常に一次元配列風のオブジェクト(C#JAVAArrayListのような)・ハッシュ=オブジェクト(C#のHashtableのような)ものだと認識した方が良さそうです。
で、一次元配列の中のハッシュを操作するには、

${$PROFILES[0]}{'name'}

という風に書きます(この場合@PROFILES配列の0番目の中の無名ハッシュリストの'name'を参照していることになる)。
よく分りませんが、この場合、配列のほうが外側(わかりにくいですね(^_^;この表現)なので、配列の部分は{}で囲む必要があります*2


 リファレンスを扱うと、ちょっと複雑なことになりやすいみたいです。なるべく省略記述を控えた方が見やすいでしょう。下手をするとデバッガのお世話にならないと何も出来なくなります(リファレンスの参照を誤った場合、エラーにはならないが内容の参照が出来ないので)。とくにCGIとなると、エラー出力を得にくいので…。

 あと、これらをすべてどうにかする方法として、型グロブというものがあるのですが…。わかりにくいのでやめた方が良いかもしれません。


 参考サイト
http://www.rfs.jp/
基礎が分かってなかったわたしにはとても参考になるサイトでした。

*1:と言うかそんな見づらい構文使うなともいわれそうですが…

*2:どうやらしなくても良いときもあるようです…が、わかりにくいのでいっそのこと常に記述しておいたほうが間違いがないでしょう(アロー演算子を使うという手もあるんだろうな…)