Perl日記

PerlとかRubyとかPHPとかPythonとか

packageについて3

packageはブロックであり、クラスであるので、クラスにインポートされた関数は他のクラスで使うことはできない。

#!/usr/bin/env perl
use strict;
use warnings;

package Foo;
use Digest::MD5 qw/ md5_hex /;

package main;

print md5_hex('aiueo'), "\n";
#=> Undefined subroutine &main::md5_hex called

しかしシンボルテーブルには乗っかっているので、クラス名をつければどこでも使える。

#!/usr/bin/env perl
use strict;
use warnings;

package Foo;
use Digest::MD5;

package main;

my $md5 = Digest::MD5->new;
print Digest::MD5::md5_hex('aiueo'), "\n";
#=> acd78951602a8cbc0cae289ceb6e579f


もちろん外部ファイルに分かれていても同じことができる。
こんなものすごい密結合な作り方もできるわけだ。

main.cgi
#!/usr/bin/local/perl
use strict;
use warnings;
use FindBin::libs;
use CGI;
use Encode;
use Digest::MD5;
use File::Basename;
use File::Spec;
use MyApp;

MyApp->run;
lib/MyApp.pm
package MyApp;

sub run {
  my $cgi = CGI->new;
  my $enc = Encode::encode('utf8', $cgi->param('form1'));
  my $md5 = Digest::MD5->new;
  my $dir = File::Basename::dirname(__FILE__);
  my $tmpl_path = File::Spec->catfile($dir, 'template');
…
}

1;

最初のブートの方で必要なものを全部読み込んで、自作モジュールでクラス名修飾しつつ使う、というのは、アリか?