+ -
当前位置:首页 → 问答吧 → 求教问题:在perl模块最后加上“1;” 还是会报错“did not return a true value”

求教问题:在perl模块最后加上“1;” 还是会报错“did not return a true value”

时间:2011-05-03

来源:互联网

本帖最后由 mmbh 于 2011-05-03 19:58 编辑

自己写的两个模块,末尾都加上了“1;”,在Main.pl中调用模块函数时一个正常但另一个报错:

Module 1:
  1. package Device::Serial;

  2. use strict;
  3. use warnings;
  4. use Win32::SerialPort;

  5. require Exporter;
  6. our @EXPORT = qw();
  7. our @EXPORT_OK = qw();
  8. sub1
  9. sub2
  10. ...
  11. 1;
复制代码
Module 2:
  1. package Init::ParseCfg;

  2. use strict;
  3. use warnings;
  4. use Config::IniFiles;

  5. require Exporter;
  6. our @EXPORT = qw();
  7. our @EXPORT_OK = qw();
  8. sub1
  9. sub2
  10. ...
  11. 1;
复制代码
Main.pl:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Carp;

  5. use FindBin qw($Bin);
  6. use lib "$Bin";

  7. use Device::Serial;
  8. use Init::ParseCfg;
复制代码
编译时报“InitParseCfg.pm did not return a true value at Main.pl line 10,
            BEGIN failed--compilation aborted at Main.pl line 10."

环境是winxp 32bit, ActivePerl 5.10.1

奇怪的是Serial模块用起来就正常,第二个不管怎么弄都要报这个错。@INC路径应该没有问题啊。请这里的高手帮忙看看是哪里出错了,万分感谢

作者: mmbh   发布时间: 2011-05-03

InitParseCfg.pm did not return a true value at Main.pl line 10,

package Init::ParseCfg;

作者: zhlong8   发布时间: 2011-05-03

本帖最后由 mmbh 于 2011-05-03 20:54 编辑

回复 zhlong8


感谢LS的回复。
我知道是这个模块的错误,Perl的提示信息很清楚,只是不知道为什么会出现这个错误而另一个模块没有出错。
请问是出现了命名冲突吗?

作者: mmbh   发布时间: 2011-05-03



QUOTE:
回复  zhlong8


感谢LS的回复。
我知道是这个模块的错误,Perl的提示信息很清楚,只是不知道为什么 ...
mmbh 发表于 2011-05-03 20:49




    你的 Init 文件夹下有 ParseCfg.pm 这个文件吗?我是这个意思。两种名字不同

作者: zhlong8   发布时间: 2011-05-03

回复 zhlong8


    谢谢你的热心回复。

    我的Main.pl所在文件夹里有一个子文件夹“Init”,里面只有一个文件“ParseCfg.pm”,Device模块也是如此。
    开始我以为是路径的问题,但是改了文件夹和pm的名字,甚至把ParseCfg.pm和Main.pl放在同一个文件夹里,直接用"use ParseCfg"和"require   ParseCfg.pm"都试过了,还是不行啊  看来自己是钻牛角尖了呢.

作者: mmbh   发布时间: 2011-05-03

本帖最后由 zhlong8 于 2011-05-03 21:53 编辑


QUOTE:
回复  zhlong8


    谢谢你的热心回复。

    我的Main.pl所在文件夹里有一个子文件夹“Init ...
mmbh 发表于 2011-05-03 21:49




    解决了还是没解决?不行把那个源文件发上来

    还有你这样用 Exporter 是没法导入函数的吧

作者: zhlong8   发布时间: 2011-05-03

  1. BEGIN {
  2.     use FindBin qw($Bin);
  3.     unshift @INC,$Bin;
  4. }
复制代码
也许改成这样就行了。use lib 是在编译阶段执行的,而不是在运行时执行。

作者: wxlfh   发布时间: 2011-05-03

回复 zhlong8


    明天我去公司再看看. 搞定了再来结贴哈.
   我这样用Export就是不要默认导入任何sub,调用时必须用完整的包名称.
   BTW, 这和模块中sub的返回值木有关系吧?

作者: mmbh   发布时间: 2011-05-03

本帖最后由 mmbh 于 2011-05-03 22:05 编辑

回复 wxlfh


    谢谢回复.

    但是Device::Serial又是可行的啊? use就相当于BEGIN{require和import}的吧,这个不是应该编译时就加载的吗?

    明天去try一try,空了一定得好好看看羊驼书啊.

作者: mmbh   发布时间: 2011-05-03



QUOTE:
回复  wxlfh


    谢谢回复.

    但是Device::Serial又是可行的啊? use就相当于BEGIN{require和imp ...
mmbh 发表于 2011-05-03 22:02




    问题不在 main.pl 你两个模块里面都是 require 'Exporter'; 应该用 use base 'Exporter';

   如果你要用全名那还要 Exporter 做什么……

作者: zhlong8   发布时间: 2011-05-03

本帖最后由 mmbh 于 2011-05-03 22:44 编辑

回复 zhlong8


    那个Exporter只是想试一试导出的例子,我现在是边学边做,各种可用的东西都拿来试一试哈.
    不用的话最后得把它注释或删掉.

作者: mmbh   发布时间: 2011-05-03