在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 9211|回复: 7

[求助] 关于perl的use的用法

[复制链接]
发表于 2016-9-8 16:22:38 | 显示全部楼层 |阅读模式
100资产
请教大家一个问题。
我在一个perl的脚本中遇到了如下的一行:
use abc;
abc是随便写的,但是我能肯定不是一个通用的pm。
之前的理解use是用来调用perl的模块即pm的。
但是此处的这个abc明显是自己写的,然而我在这个perl文件中没有找到与其相关的信息,倒是没有定义的sub有一些。

请问这个情况下,use的具体作用是?abc也是类似pm的东东么?
我没有看见这个pl之前source了其他pl。
那么这个abc应该是哪里来的?如何调用它呢?

谢谢!

最佳答案

查看完整内容

回复 4# yueluofenghen 恩,那就是很有可能之前的目录下有个叫abc.pm的文件。 我是这么理解use和require的,require就是把一个文件加载到程序中,就像是C里面的#include。 书上说两者是有区别的,require会在编译完成后在调用,而use是在编译时执行,我的理解是require语句比较low,如果require语句写在代码的下面就会出问题,而use语句如果里面有变量啥的也是有问题的,比如 $package = "abc"; use $package; ...
发表于 2016-9-8 16:22:39 | 显示全部楼层
回复 4# yueluofenghen


   恩,那就是很有可能之前的目录下有个叫abc.pm的文件。
  我是这么理解use和require的,require就是把一个文件加载到程序中,就像是C里面的#include。

  书上说两者是有区别的,require会在编译完成后在调用,而use是在编译时执行,我的理解是require语句比较low,如果require语句写在代码的下面就会出问题,而use语句如果里面有变量啥的也是有问题的,比如

    $package = "abc";
    use $package;

  当然,大概没有人会这么写……所以两者没啥大区别,只是require不只能识别.pm文件,在双引号里的任何文件都是可以识别的,而use语句格式更加规范。所以如果abc.pm在当前目录下,用require "./abc.pm";和用use abc;是一样的。

  最后,如果我的代码里面删掉一个use的话会报:
    undefined subroutine 模块里的函数名 at 程序多少行
  因为我的模块里只有一些子函数……
发表于 2016-9-9 09:48:54 | 显示全部楼层
use语句只接受模块(pm)名而不是文件名。
  感觉require是include或者source文件的感觉,而use的话会提前编译执行。书上说的use语句一旦被进行语法分析时就会执行。

  如果楼主说的abc不是通用模块的话,那可能有一下几种来源:

  1. 在内建数组@INC中的路径下,用terminal可以看 perl -e 'print "@INC\n"',里面还有一个 . 也就是当前路径下的模块,容易被忽略。

  2. 在terminal的运行Perl的命令行里,由-I选项引导的,例如perl -I/local/perllib xxx.pl

  3. 在环境变量PERL5LIB里面(我的环境变量里面都没有这个……)

  4. use前更改过@INC,例如unshift @INC, "/local/perllib"

  要是这些地方也找不到的话,我也不清楚了,最近刚接触Perl的面向对象编程,所以还有点印象
发表于 2016-9-9 09:52:24 | 显示全部楼层




   对了,我是在Linux上的,Windows上的不太会玩。
 楼主| 发表于 2016-9-9 10:36:39 | 显示全部楼层
回复 2# mndzjsjczex
谢谢!
use之前没有其他内容,也不是在命令行运行。所以2 4 可以排除。1和3看起来的话也不太可能,因为我能肯定这个abc不是通用的模块,并且现在是运行的时候报告这个地方有语法错误。所以最有可能的是楼上提到的@INC中的"."  
因为这个文件是别人提供的,所以不能肯定原始情况下同目录下是不是有这个abc的定义。
但是如果abc是个package,似乎应该是用require?
也就是说最有可能的情况是,有人写了这个名为abc的模块,放在了当时的同级目录下?
这样我还有个疑问就是,perl在遇到一个use语句的时候,应当会在1,3等各种路径下寻找“abc”的模块,如果找不到,会如何报告?不知和我看到的是否一样
 楼主| 发表于 2016-9-9 15:50:33 | 显示全部楼层
回复 5# mndzjsjczex
嗯,多谢。现在基本可以判断就是在原始的同级目录下有个.pm没有拿到。
发表于 2016-10-30 12:00:44 | 显示全部楼层
高达上的问题,小白表示看不懂。收藏了好好研究学习
发表于 2022-3-27 09:42:42 | 显示全部楼层
very helpful
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 10:44 , Processed in 0.027905 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表