useの話かも

「use」はモジュールをインポートするものですが、

package Foo;
use strict;
use warnings;

sub new {};
sub foo {};
1;

上記モジュールを利用するスクリプト

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use lib qw(.)
use Foo;

print Dumper \%{Foo:};
exit;

出力結果

$VAR1 = {
          'BEGIN' => *Foo::BEGIN,
          'foo' => *Foo::foo,
          'new' => *Foo::new,
          'import' => *Foo::import
        };

これは、Fooモジュールのシンボルテーブルの中身であってFooモジュールで定義されている変数や関数になるわけだが、「BEGIN」は良いとして、「import」ってなんぞや?そんなものは書いた覚えがない、勝手に作られたのかな〜というわけなんだが、Perlの仕様で「use」した場合、自動的に「import」メソッドを呼び出すとの事。

ただし〜モジュールを呼び出す側で、ある事をするとですね。面白い事になる。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use lib qw(.)
use Foo ();

print Dumper \%{Foo:};
exit;

出力結果

$VAR1 = {
          'BEGIN' => *Foo::BEGIN,
          'foo' => *Foo::foo,
          'new' => *Foo::new,
        };

「import」が消えた!「use」する際にモジュールに「()」を書いて明示的にすると「import」メソッドが呼ばれません。面白いね。よく入門書を見たりすると、モジュールごとに「()」があったりなかったりしてあるが、特に深く考えなかった。明示的に「()」を書いて「import」メソッドを呼ばないようにするって事はメモリの節約になるから、そういった細かなところまで気を配っているんですね。面白いよ。ではでは