如何直接调用自己写的方法,而不用在调用时加上 包名->

如何直接调用自己写的方法,而不用在调用时加上 包名->

我写了一个方模块 TEST.pm:

package TEST;
use strict;

sub printnum {
        shift @_;
        my ($initnum1,$initnum2) = @_;
        #print "$initnum1 + $initnum2 = " . $initnum1 + $initnum2 . " \n";
        print "$initnum1 + $initnum2 = ";
        print $initnum1 + $initnum2;
        print " \n";
}
1;



使用TEST包的printnum方法 tt.pl:

unshift ( @INC, 'pwd' );
use strict;
use TEST;
print "use package TEST \n";
#TEST->printnum (100,10);            #这样调用才可以
printnum (100,10);                #这样调用就报Undefined subroutine &main::printnum called at tt.pl line 6.


为什么不能直接这样使用printnum (100,10)呢。


就算在 TEST.pm中添加如下代码:
use Exporter;
our @EXPORT = qw( printnum );

在tt.pl中添加:
use Exporter;
our @ISA = qw( Exporter, TEST );

也不行。这是为什么呢?哪儿错了
另外当时使用TEST->printnum (100,10);这种方式的时候不用添加@EXPORT和@ISA也可以执行。这又是为什么?
还是用包名+方法名这样调用安全,虽然麻烦一点。

或者使用你的包时,这样试试

use TEST qw/printnum/;
使用 Exporter:

QUOTE:
ACA80110:tmp lee$ cat t.pl
#!/usr/bin/perl -I.

use strict;
use warnings;

use Foo;

foo();
ACA80110:tmp lee$ cat Foo.pm
package Foo;

use strict;
use warnings;

use Exporter qw(import);
our @EXPORT = qw(foo);

sub foo {
        print "in ", __PACKAGE__, "'s foo subroutine\n";
}
ACA80110:tmp lee$ ./t.pl
in Foo's foo subroutine

使用 OO 方式:

QUOTE:
ACA80110:tmp lee$ cat t.pl
#!/usr/bin/perl -I.

use strict;
use warnings;

use Foo;

my $t = new Foo;
$t->foo();
ACA80110:tmp lee$ cat Foo.pm
package Foo;

use strict;
use warnings;

sub new {
        my $class = shift;
        $class = ref($class) || $class;

        my $self = {};
        bless $self, $class;
}

sub foo {
        print "in ", __PACKAGE__, "'s foo subroutine\n";
}

1;
ACA80110:tmp lee$ ./t.pl
in Foo's foo subroutine



QUOTE:
原帖由 MMMIX 于 2008-12-14 15:26 发表
使用 Exporter:

我复制了一个你上面的代码,可是我这儿还是不行。报Undefined subroutine &main::foo called at e1.pl line 7

用OOP的方式我这市可以的,但是我想要的是像掉用perl内置的模块那样,不用模块名。


QUOTE:
原帖由 miaho 于 2008-12-14 15:59 发表



我复制了一个你上面的代码,可是我这儿还是不行。报Undefined subroutine &main::foo called at e1.pl line 7

完整的复制了?没有任何改动?

QUOTE:
但是我想要的是像掉用perl内置的模块那样,不用模块名。

Perl 的哪个模块是这么用的?


[Copy to clipboard] [ - ]
CODE:
{
        package TEST;
        *main::printnum='printnum';
        sub printnum{
                my($initnum1,$initnum2)=@_;
                print "$initnum1 + $initnum2 = ";
                print $initnum1+$initnum2;
        }
}
use TEST;
print "use package TEST \n";
printnum(100,10);

文件名 util.pm

[Copy to clipboard] [ - ]
CODE:
sub test {
   print "hello!!!";
}

1;

其它文件调用时 用require

[Copy to clipboard] [ - ]
CODE:
require "./util.pm";

&test;

这个办法很恶心   不建议这么用



QUOTE:
原帖由 hitsubunnu 于 2008-12-15 08:55 发表
文件名 util.pm

sub test {
   print "hello!!!";
}

1;


其它文件调用时 用require

require "./util.pm";

&test;


这个办法很恶心   不建议这么用

既然所有符号都在 main:: 中,那还分文件干嘛?

BTW,  require "./util.pm"; 这个可换为 require util; 或 use util; 然后在 #! 加 -I.
&test; 也可换为 test();

BTW again, Perl 中名字全为小写的 module 是为 pragmatic module 预留的,还是不要用的好。


QUOTE:
原帖由 miaho 于 2008-12-14 15:59 发表



我复制了一个你上面的代码,可是我这儿还是不行。报Undefined subroutine &main::foo called at e1.pl line 7

看看use xxxx 和模块中的 package xxxx是否一致。