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