低レベルなヒトの覚え書き

●余談、のようなもの


4. Perlバイナリの@INC

註: この項目の内容は、こちらのページ (v-hlin7.htm) の、特にこの部分 (v-hlin7.htm#hlin7ex) と深い関係があります。 よろしかったら、ご一読ください。

さて。
「@INC」とは、Perlの特殊変数のひとつです。 通常は、スクリプトの検索パスを記憶しておくために使われます。 「親切な」タイプのPerlバイナリなら、ユーザーが何もしなくても、標準ライブラリのファイルの所在が登録されているはずです。
たとえば、nsPerlの5.005_03や、DJGPP版の5.005_03の場合は、こんな感じになります(前者は「C:\NSPERL」、後者は「C:\DJPERL」にインストール)。

[表12~]
 ----------------------------------------------------------------------
  @INC        nsPerl5.005_03                      DJGPP版5.005_03
 ----------------------------------------------------------------------
  [0]     C:\NSPERL\lib/MSWin32-x86           c:/djperl/lib/perl5
  [1]     C:\NSPERL\lib                       c:/djperl/lib/perl5/site
  [2]     C:\NSPERL\site\lib/MSWin32-x86      c:/djperl/lib/perl5/site
  [3]     C:\NSPERL\site\lib                  .
  [4]     .
 ----------------------------------------------------------------------

どちらもありきたりの既製品なのに、@INCのデフォルトの値が正しい内容になっているのは、自動的に設定を変更する仕組みがあるからです(たぶん)。
ただ、当然のことながら、すべてのバイナリがそういった仕組みを備えているわけではありません。
たとえば、DJGPP版の5.6.1や、DOS用JPerlの4.036+1.4の場合は、こんな感じです(前者は「C:\DJP561」、後者は「C:\DOSJP」にインストール)。

[表14]
 ----------------------------------------------------------------------
  @INC           DJGPP版5.6.1                 DOS用JPerl4.036+1.4
 ----------------------------------------------------------------------
  [0]     /dev/env/DJDIR/lib/perl5            /usr/local/lib/perl
  [1]     /dev/env/DJDIR/lib/perl5/site       .
  [2]     /dev/env/DJDIR/lib/perl5/site
  [3]     /dev/env/DJDIR/lib/perl5/site
  [4]     .
 ----------------------------------------------------------------------

次に、@INCのデフォルト値が信用できないタイプのPerlバイナリを使って、標準ライブラリを呼び出す方法について考えます。

[リスト11-1]
 | $A=.5;
 | $B=2;
 |
 | printf("real %g\n", $A+$B);
 |
 | use integer;
 | printf("int %g\n", $A+$B);
 |
 | print join("\n", @INC);

DJGPP版のPerlの5.6.1を使って、単純にリスト11-1を実行すると、「integer.pmが見つからない」といわれてしまいます。 この件に関して、筆者が考えた対策は次のとおり。

というわけで、出来上がったのが以下のスクリプトです。 けっして美しくはありませんが、とりあえず機能はします。

[リスト11-2a]
 | # 11-2a.pl(本体)
 | require '11-2b.pl';
 |
 | $A=.5;
 | $B=2;
 |
 | printf("real %g\n", $A+$B);
 |
 | require '11-2c.pl';
 |
 | print join("\n", @INC);

[リスト11-2b]
 | # 11-2b.pl
 | splice (@INC, 0, 4);
 | unshift (@INC, 'c:\djp561\lib\perl5\site');
 | unshift (@INC, 'c:\djp561\lib\perl5');
 | 1;

[リスト11-2c]
 | # 11-2c.pl
 | use integer;
 | printf("int %g\n", $A+$B);
 | 1;

リスト11-2aの実行結果は、次のようなものとなります。

[例]
 | C:\EXP>perl 11-2a.pl
 | real 2.5
 | int 2
 | c:\djp561\lib\perl5
 | c:\djp561\lib\perl5\site
 | .

ところで。
ここまで読んだくださった方は、すでにお気づきのことと思いますが、本当は、この問題は、もっと簡単に解決できます。

まあねえ、そんなことだろうとは思ってましたよ。 負け惜しみですけど。
ちなみに、「PERLLIB」も「BEGIN」も、それから「print join("\n", @INC);」も、全部、Perl FAQに書いてありました(perlfaq2とperlfaq8)。
やっぱり、もうちょっとちゃんと勉強しないといけないかも。

→トップ


R.2: 2006/08/01
Copyright (C) 2006 A.Satoshi