为什么 Exporter 模块 不像perldoc 里面说的正常工作?
时间:2010-10-26
来源:互联网
如题
Perl automatically calls the import method when processing a use statement for a module.
我写了个超级简单的 pm 。但是 use的时候无法调入 main:: 里面 。。。为啥呢:
c.pm:
- package c;
- use Exporter;
-
- @EXPORT = qw/ddiiee/;
-
- sub ddiiee() {
- die "die die die";
- }
- 1;
- #!/bin/usr/perl -w
- use strict;
- use lib './';
- use c;
-
- if(fork()) {
- print "i am parent,juse die see the zom";
- ddiiee();
- }
-
- else {
- print "i am child and iam gonna exit";
- sleep 2;
- exit 0 ;
- }
- jerry@hazard:~/Desktop/chinaunix/perl> perl fork
- Undefined subroutine &main::ddiiee called at fork line 8.
- i am parent, see the zomjerry@hazard:~/Desktop/chinaunix/perl> i am child and iam gonna exit
- jerry@hazard:~/Desktop/chinaunix/perl>
作者: nuclearxin 发布时间: 2010-10-26
- package c;
- use Exporter;
-
- our @EXPORT = qw/ddiiee/;
- our @ISA = qw/Exporter/;
-
- sub ddiiee
- {
- die "die die die";
- }
-
- 1;
作者: 黑色阳光_cu 发布时间: 2010-10-26
@ISA = qw/Exporter/;
就没问题
问题是 为什么?
作者: nuclearxin 发布时间: 2010-10-26
我知道加上
@ISA = qw/Exporter/;
就没问题
问题是 为什么?
作者: nuclearxin 发布时间: 2010-10-26
use的华 应该自动导入 Exporter里面的 import 函数 阿
正如 docperl里面解释的
如果我想用require的话我 应该加入@ISA = qw/Exporter/;
应该是这样阿
看url里面的例子 一个用use 一个用require
package YourModule;
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(munge frobnicate); # symbols to export on request
--------------------------------------
package YourModule;
use Exporter 'import'; # gives you Exporter's import() method directly
@EXPORT_OK = qw(munge frobnicate); # symbols to export on request
作者: nuclearxin 发布时间: 2010-10-26
作者: 黑色阳光_cu 发布时间: 2010-10-26
黑色阳光_cu 发表于 2010-10-26 11:18
同样的问题 你说的还是 @ISA;
你的意思是 Exporter 有 的 import 无法用use 带入进来是吗?
看他的例子!
用use的时候根本没有 @ISA
作者: nuclearxin 发布时间: 2010-10-26
你的意思是 Exporter 有 的 import 无法用use 带入进来是吗 ...
nuclearxin 发表于 2010-10-26 11:23
给你个最简化的import,只能导入函数~~~
- package c;
- use strict;
- use warnings;
-
- our @EXPORT = qw/ddiiee/;
-
- sub ddiiee
- {
- die "die die die";
- }
-
- sub import
- {
- no strict qw(refs);
- foreach my $s (@EXPORT)
- {
- if (__PACKAGE__->can($s))
- {
- *{"main::$s"} = \&{*{__PACKAGE__ . "::" . $s}};
- }
- }
- }
-
- 1;
作者: 黑色阳光_cu 发布时间: 2010-10-26
仔细看了看例子
nnd
nnd
Exporter 的 import 就是无法用use 加进来。
Exporter 的作者为啥不把 import加进来阿?
必须要 手动 加入进来
作者: nuclearxin 发布时间: 2010-10-26
仔细看了看例子
nnd
nnd
Exporter 的 import 就是无法用use 加进来。
Exporter 的作者 ...
nuclearxin 发表于 2010-10-26 11:26
use一个包时,Perl会去找包里的import方法,当import方法不存在,就会按*ISA{ARRARY}里指明的继承顺序,在一个一个母类里找,直到找到。这也是@ISA要声明为our类型的原因。
作者: 黑色阳光_cu 发布时间: 2010-10-26
第一个 import必须要手动 那进来对吗?
作者: nuclearxin 发布时间: 2010-10-26
第一个 import必须要手动 那进来对吗?
nuclearxin 发表于 2010-10-26 11:32
抱歉,我以为你问@ISA起什么作用呢?
好像Exporter默认不导出import函数,要写 use Expoter qw(import); 才可以
- package c;
-
- use strict;
- use warnings;
- use Exporter qw(import);
-
- our @EXPORT = qw/ddiiee/;
-
- sub ddiiee
- {
- die "die die die";
- }
-
- 1;
作者: 黑色阳光_cu 发布时间: 2010-10-26
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28