ラクダ本を読みながらごろごろ。
ごろごろしながら読むには重過ぎますが。あの本。
Exporterメモ。
$ cat foo.pm
package foo;
our @ISA = qw(Exporter);
our @EXPORT = qw(foo bar);
sub foo{print "foo\n"}
sub bar{print "bar\n"}
1;
$ cat foo.pl
use strict;
use warnings;
use foo;
foo();
bar();
$ perl foo.pl
foo
bar
を
$ cat foo.pm
package foo;
our @ISA = qw(Exporter);
our @EXPORT = qw(foo bar);
my $foo;
sub import
{
$foo = $_[1];
}
sub foo{print "$foo\n"}
sub bar{print "bar\n"}
1;
$ cat foo.pl
use strict;
use warnings;
use foo qw(foobar);
foo();
bar();
とかしてuseする際に値を渡すようにしようとすると、
$ perl foo.pl
Undefined subroutine &main::foo called at foo.pl line 5.
そんなsubroutineないと怒られる。
を参考に
$ cat foo.pm
package foo;
our @ISA = qw(Exporter);
our @EXPORT = qw(foo bar);
my $foo;
sub import
{
$foo = $_[1];
foo->export_to_level(1, @_);
}
sub foo{print "$foo\n"}
sub bar{print "bar\n"}
1;
とすると、
$ perl foo.pl
"foobar" is not exported by the foo module
Can't continue after import errors at foo.pm line 10
BEGIN failed--compilation aborted at foo.pl line 3.
そんなものexportされていないと怒られる。
export_to_levelは
MyPackage->export_to_level($where_to_export, $package, @what_to_export);
のようになっているので、@what_to_exporに余計なモノが混入するのが原因。
$ cat foo.pm
package foo;
our @ISA = qw(Exporter);
our @EXPORT = qw(foo bar);
my $foo;
sub import
{
$foo = $_[1];
foo->export_to_level(1, $_[0]);
}
sub foo{print "$foo\n"}
sub bar{print "bar\n"}
1;
とすれば、
とりあえず通る。