importとExporterの食い合わせが悪い?

useしたらpという関数が使えるようにしよう。

Mod1.pm

package Mod1;
use strict;
use warnings;

use base qw/Exporter/;
use Data::Dumper;

our @EXPORT = qw/p/;

sub p {warn Dumper shift}

1;

main.pl

use Mod1;
p 123;

実行

% perl main.pl
$VAR1 = 123;

useしたらuse strict/warningsしたことになるようにしよう。

Mod2.pm

package Mod2;
use strict;
use warnings;

sub import {
    strict->import;
    warnings->import;
}

1;

main.pl

use Mod2;
sub hoge{
    my ($va, $vb) = @_;
    print $va + $vb,"\n";
}
hoge(1);

実行

% perl main.pl
Use of uninitialized value in addition (+) at main.pl line 4.
1

main2.pl

use Mod2;
$hoge=123;

実行結果

% perl main2.pl
Global symbol "$hoge" requires explicit package name at main2.pl line 2.
Execution of main2.pl aborted due to compilation errors.

useしたらpという関数が使えるようになって、use strict/warningsしたことになるようにしよう。

Mod3.pm

package Mod3;
use strict;
use warnings;

use base qw/Exporter/;
use Data::Dumper;

sub import {
    strict->import;
    warnings->import;
}

our @EXPORT = qw/p/;

sub p {warn Dumper shift}

1;

main.pl

use Mod3;
sub hoge{
    my ($va, $vb) = @_;
    print $va + $vb,"\n";
}
hoge(1);
p 123;

実行結果

% perl main.pl
Number found where operator expected at main.pl line 7, near "p 123"
        (Do you need to predeclare p?)
syntax error at main.pl line 7, near "p 123"
Execution of main.pl aborted due to compilation errors.

おうっふ。


原因が分からなかったのでWeb::Scraperをパクった。

Mod4.pm

package Mod4;
use strict;
use warnings;

use Data::Dumper;

sub import {
    my $pkg = caller;

    strict->import;
    warnings->import;

    no strict 'refs';
    *{"$pkg\::p"} = \&p;
}

sub p {warn Dumper shift}

1;

main.pl

use Mod4;
p 123;
sub hoge{
    my ($va, $vb) = @_;
    print $va + $vb,"\n";
}
hoge(1);

実行結果

% perl main.pl
$VAR1 = 123;
Use of uninitialized value in addition (+) at main.pl line 5.
1

main2.pl

use Mod4;
$hoge=123;

実行結果

% perl main2.pl
Global symbol "$hoge" requires explicit package name at main2.pl line 2.
Execution of main2.pl aborted due to compilation errors.


木曜になっても分からなかったら柔道家に訊こう…