免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3024 | 回复: 8
打印 上一主题 下一主题

use vs require [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-17 23:43 |只看该作者 |倒序浏览
本帖最后由 pengphy 于 2011-08-17 23:47 编辑

额 最近看了几篇文章 关于perl 中use 和 require, 分享一篇吧

http://www.perl.com/pub/2002/05/14/mod_perl.html

有个疑问是, require 不会导入名字? 那为什么 require后 还是可以直接调用定义在required 中的函数呢? (勿笑)

看了好几篇文章 都是说use 才会pollute 命名空间。。。。
  1. use module qw();

  2. # equals

  3. BEGIN{
  4.     require module;  
  5.     module->import();
  6. }
复制代码
ps:
use引入模块的同时,也引入了模块的子模块。而require则不能引入,要重新声明

论坛徽章:
0
2 [报告]
发表于 2011-08-18 08:09 |只看该作者
回复 1# pengphy


    看这个文章:
    http://hi.baidu.com/zhujian0805/ ... 99942a0cd7da23.html

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2011-08-18 08:36 |只看该作者
因为 require 没有调用相应包的 import 函数

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2011-08-18 08:40 |只看该作者
本帖最后由 zhlong8 于 2011-08-18 08:41 编辑
ps:
use引入模块的同时,也引入了模块的子模块。而require则不能引入,要重新声明


你自己也写了 use 不过是 require 包装下,无非是在编译期执行而且多调用了 import 可没引入子模块的问题。所以你这个不同是怎么总结出来的?Perl 的子模块都是概念上的,最终还是要自己主动加载不管是 use 还是 require 甚至 do

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
5 [报告]
发表于 2011-08-18 08:43 |只看该作者
本帖最后由 seufy88 于 2011-08-18 09:00 编辑

"use引入模块的同时,也引入了模块的子模块。而require则不能引入"这句话是什么意思,什么是模块的子模块?
昨天正好请教zhlong8,然后整理了一下午。我说说我的看法吧:
   use module qw
  等价于:
  BEGIN{
        require module;  
        package->import();
    }
一般来说,模块A.pm中会有package A,所以会导入package A中的包变量,但是如果A.pm中没有package A,只有package B,package C,那么不会import任何包变量,即使你用的是use A;
而 require 后面跟的应该是module,也就是.pm文件,它的作用好像是创建.pm下所有package的符号表
有不对的地方还请各位指摘,谢谢

----------------
假设A.pm内容如下:
package B;
.....
@EXPORT=qw/$B/;
....

package C;
......
@EXPORT=qw/$C/;
......

用户程序:
#!/usr/bin/perl
use A;
.....
------------------
这样一来,main::中也不会有$B,$Cimport进来的。但是如果把A.pm改成B.pm,再use B.pm,就立马有$B import进来了,但$C还是import不进来。

小弟刚理解,不知道对不对。
#####################################

论坛徽章:
1
双子座
日期:2013-11-06 17:18:01
6 [报告]
发表于 2011-08-18 09:04 |只看该作者
回复  pengphy


    看这个文章:
Perl_Er 发表于 2011-08-18 08:09



    这篇文章里关于require的
"如果使用require Module的话,则需要定义Module.pm的文件而且文件中的package要以Module来命名该模块"
Module.pm文件中一定要有以 Module命名的package 吗?我觉得好像不是”一定“吧
如果一个模块是Module.pm
它文件中全是package A,B,C...的话
require Module之后
完全可以通过全名访问这些package A,B,C等中的所有包变量的呀

论坛徽章:
0
7 [报告]
发表于 2011-08-18 11:32 |只看该作者
use:编译时执行
require:运行时执行
use执行时导入了相关符号(函数、变量等)。

论坛徽章:
0
8 [报告]
发表于 2011-08-18 23:12 |只看该作者
  1. foreach $symname (sort keys %main::) { local *sym = $main::{$symname}; print "\$symname is defined\n" if defined $sym; print "\@$symname is nonnull\n" if @sym; print "\%$symname is nonnull\n" if %sym; }
复制代码
找到一段牛X 代码 programming perl上看到的

其实我们要引入的xx.pm如果没有定义package(namespace), 所有的符号都会导入进来
require 和 use 的行为差不多(run-time, compile-time bla...)

但是如果xx.pm定义了 package, 那么用require就不行了

需要用use 去导入符号表, 当然在xx.pm模块中需要一些Exporter的玩意儿
我们use xx; 的时候会默认导入default tag中的符号,所以这样称之为pollute namespace吧

FYI

论坛徽章:
0
9 [报告]
发表于 2011-08-18 23:33 |只看该作者
原来 perl -d debug模式下 可以用V 来dump出所有变量 牛x啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP