2009年3月15日
先月はPHPで今月はPerl
今月はPerlの改修案件の仕事をやっている。スクラッチから書くのではないのでもともとのコードの書き方に悩まされている。「use strict」されていないコードがあって、こんな感じのコードが書かれていた。複数のコードが共有する変数がまとめてある。
package MyApp_GLOBALS;
use base 'Exporter';
@EXPORT = qw($HOST_IP $APP_PATH);
$HOST_IP = '192.168.0.1';
$APP_PATH = '/home/songmu/myapp/';
1;
変数宣言されていない変数が大量にあったのだが、その場合変数のスコープがどうなるか分からなかったので調べてみた。
- 基本的にはourでの宣言と同じでグローバル変数になる
- ただし、親ブロックや同一スコープ内で既に同名の変数が宣言されている場合は、警告無しに上書きしてしまう
と言うところのようだ。まあ、素直にour宣言しておきましょうってことですね。そうしないと意図とは違う動きをする可能性があって危険。ourはPerl5.6で追加されたものらしいので、書いた人は知らなかったようだ。正しくはこんな感じかな。
package MyApp_GLOBALS;
use strict;
use warnings;
use Readonly;
use base 'Exporter';
our @EXPORT = qw($HOST_IP $APP_PATH);
Readonly our $HOST_IP => '192.168.0.1';
Readonly our $APP_PATH => '/home/songmu/myapp/';
1;
あとはプロトタイプとか使われているところとかあって、それで何故かサブルーチン呼び出しがアンパサンド付きになったりしているのが謎。プロトタイプとかPerlベストプラクティスで非推奨になってたから全然使おうとか考えた事もなかったが、いまいち理解していなかったので、プログラミングPerlを引っ張り出して勉強しなおして、Perlベストプラクティスを読み返してなぜ非推奨なのかも理解しなおした。