m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

Perlのモジュールでモジュール名とかを省略する

なんかたまに

use Sample::Test1 qw(test1 test2);

こんな感じの記述があるソースをperlで見かけるけどなんでか」わからないのでちょっと調べた

エクスポートしているとのこと

よくわからないので実装サンプルを作ってみた。

いままで

sample.pl
#!/usr/bin/env perl

use strict;
use warnings;

use Sample::Test1;

my $result;
$result = Sample::Test1::test1();
print $result . "\n";

$result = Sample::Test1::test2(200);
print $result . "\n";
lib
package Sample::Test1;

sub test1{
    return "Sample-Test1_test1()";
}

sub test2{
    my ($aaa) = @_;
    return $aaa * 100;
}

# おまじないらしい
1;

今回のもの(モジュール名を省略)

#!/usr/bin/env perl

use strict;
use warnings;

use Sample::Test1 qw(test1 test2);

my $result;
$result = test1();
print $result . "\n";

$result = test2(200);
print $result . "\n";
モジュールにパッケージを指定(Exporterを定義して設定)
package Sample::Test1;

BEGIN{
    use Exporter;
    @ISA = qw(Exporter);
    @EXPORT_OK = qw(test1 test2);
}

sub test1{
    return "Sample-Test1_test1()";
}

sub test2{
    my ($aaa) = @_;
    return $aaa * 100;
}

# おまじないらしい
1;

※「@EXPORT_OK」に指定するといける

これでおkらしい

まとめ

毎回モジュール名を指定するのが億劫な場合は役に立つかと思われる。
インスタンスメソッドはともかく、クラスメソッドの場合はない方が便利な場合もあるので…