Perlのuse

Perlでuseを使ってモジュールをインポートする場合、
use Cwd;
というモジュール指定と、
use Cwd qw(realpath abs_path);
という関数を個別に指定する方法がある。
(面倒なので関数とだけ書いてますが変数でもなんでも)
両方の指定方法を同時に使用することもできます。


どちらでもCwd::がmain::のシンボルテーブルに読み込まれることは同様で、Cwd::realpath(".");等、モジュール名から辿る方法で定義された関数にアクセスできるようになります。


じゃ、違いはというと、

  • 上の指定方法だとモジュール内の@EXPORTで指定された関数がmain::テーブルにロードされる。
  • 下の方法だと指定した関数だけがmain::テーブルにロードされる。

ということです。main::テーブルに読み込まれれば関数名だけでアクセスできますが、名前の衝突回避のためになんでもかんでもロードしちゃえばいいというふうにはなっていないと。

そしてモジュール内の@EXPORT_OKで指定された関数に関しては下の方法で明示的に指定してやらないとmain::テーブルにはロードされません。



以下、試し。
準備として@EXPORT,@EXPORT_OKの中身を見てみます。

$ perl -MCwd -le 'print for sort @Cwd::EXPORT'
cwd
fastcwd
fastgetcwd
getcwd

$ perl -MCwd -le 'print for sort @Cwd::EXPORT_OK'
abs_path
chdir
fast_abs_path
fast_realpath
realpath


そしてまずは何もインポートせずにメインテーブルのエントリを表示してみます。
Perlのシンボルテーブルは基本的にただのハッシュです。)

$ perl -le 'print for sort keys %main::'
...
ENV
...
stdout
utf8::

0,ARGV,ENV,STDIN、おなじみの面々が見えます。

次はuse Cwd;で

$ perl -MCwd -le 'print for sort keys %main::'
...
cwd
fastcwd
fastgetcwd
getcwd
...

@EXPORTで指定されたgetcwd等は見えますが@EXPORT_OKで指定されたrealpathは見えません。
じゃ次は個別指定。

$ perl -le 'use Cwd qw(realpath abs_path);print for sort keys %main::'
...
abs_path
attributes::
main::
realpath
...

今度は個別指定したrealpathやabs_pathは見えますが、getcwd等は見えません。


両方使えば@EXPORTの全てと@EXPORT_OKの一部をmain::に読み込んだりできると。
ちなみにインポートを禁止する@EXPORT_FAILというのもあります。