[johnsca@CORY tmp]$ cat tst.pm
#!/usr/bin/perl
package tst;
use warnings;
use strict;
*import = \&foo;
sub foo {
print "Import foo\n";
}
1;
[johnsca@CORY tmp]$ cat tst.pl
#!/usr/bin/perl
use warnings;
use strict;
use lib '.';
use tst;
[johnsca@CORY tmp]$ perl -c tst.pm
Name "tst::import" used only once: possible typo at tst.pm line 9.
tst.pm syntax OK
[johnsca@CORY tmp]$ perl -c tst.pl
Import foo
tst syntax OK
[johnsca@CORY tmp]$ perl tst.pm
Name "tst::import" used only once: possible typo at tst.pm line 9.
[johnsca@CORY tmp]$ perl tst.pl
Import foo
From this, I think makes sense. The warning when running perl -c tst.pm (and perl tst.pm) is appropriate, as import is only used once, when you consider only tst.pm. However, once you throw tst.pl into the mix, you get another (implicit) use of *tst::import via the use, as you said, which silences the warning. This makes sense as, according to the docs for use:
It is exactly equivalent to
BEGIN { require Module; import Module LIST; }
except that Module must be a bareword.
To prevent the warning when checking tst.pm, you can locally disable warnings, as I suggested before, or you can add another (no-op) reference to *import. In the code below, I use use vars qw/*import/; because our doesn't seem to like typeglobs. :) <Update>Though our $import; seems to get rid of the error just fine.</Update>
[johnsca@CORY tmp]$ cat tst.pm
#!/usr/bin/perl
package tst;
use warnings;
use strict;
use vars qw/*import/;
# or: *import = *import;
*import = \&foo;
sub foo {
print "Import foo\n";
}
1;
[johnsca@CORY tmp]$ perl -c tst.pm
tst.pm syntax OK
bbfu
Black flowers blossum
Fearless on my breath |