免费注册 查看新帖 |

Chinaunix

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

编写package遇到的一个问题 [复制链接]

论坛徽章:
6
IT运维版块每日发帖之星
日期:2015-09-05 06:20:00IT运维版块每日发帖之星
日期:2015-09-06 06:20:00IT运维版块每日发帖之星
日期:2015-10-17 06:20:00IT运维版块每周发帖之星
日期:2015-11-06 19:28:13IT运维版块每日发帖之星
日期:2015-11-07 06:20:00操作系统版块每周发帖之星
日期:2015-12-02 15:01:04
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-27 15:57 |只看该作者 |倒序浏览
我现在想做的事情是编写一个package,里面包含一些变量的定义和函数的定义。然后另外一个脚本来调用这个package里面的变量或者方法。
我自己做了一个简单的实验。
parameter.pm:
package parameter;
use strict;
sub xprint
{
my $x=10;
return $x;
}
1;

test.pm:
#!/usr/bin/perl -w
use parameter;
$result=parameter->xprint();
print "this is $result \n";

不明白的是A脚本中最后一行1;是做什么用的,如果将该行注释或者删除则B无法成功调用A,错误信息如下:
parameter.pm did not return a true value at ./test.pm line 2.
BEGIN failed--compilation aborted at ./test.pm line 2.

如果我将test.pm修改如下:
#!/usr/bin/perl -w
require parameter;
$result=parameter->xprint();
print "this is $result \n";
即使删除1;也可以成功调用。不明白是怎么回事,请高手指教!
谢谢了!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-03-27 16:06 |只看该作者
parameter.pm did not return a true value at ./test.pm line 2.

其实要的是 true 不一定非要用 1。别的也行。

论坛徽章:
0
3 [报告]
发表于 2008-03-27 16:20 |只看该作者
原帖由 risepp 于 2008-3-27 15:57 发表
我现在想做的事情是编写一个package,里面包含一些变量的定义和函数的定义。然后另外一个脚本来调用这个package里面的变量或者方法。
我自己做了一个简单的实验。
parameter.pm:
package parameter;
use st ...


最后那个1 是必需的。每个包都有,返回一个 真的值。

论坛徽章:
6
IT运维版块每日发帖之星
日期:2015-09-05 06:20:00IT运维版块每日发帖之星
日期:2015-09-06 06:20:00IT运维版块每日发帖之星
日期:2015-10-17 06:20:00IT运维版块每周发帖之星
日期:2015-11-06 19:28:13IT运维版块每日发帖之星
日期:2015-11-07 06:20:00操作系统版块每周发帖之星
日期:2015-12-02 15:01:04
4 [报告]
发表于 2008-03-27 17:10 |只看该作者
哦,知道了,这个是perl设计就是如此的吧,但是为什么要这样做啊? 有什么目的或者好处麽?

论坛徽章:
0
5 [报告]
发表于 2008-03-27 17:20 |只看该作者
原帖由 risepp 于 2008-3-27 17:10 发表
哦,知道了,这个是perl设计就是如此的吧,但是为什么要这样做啊? 有什么目的或者好处麽?


保证模块成功加载

When a module is loaded (via use) the compiler will complain unless the last statement executed when it is loaded is true. This line ensures that this is the case (as long as you don't place any code after this line). It's Perl's way of making sure that it successfully parsed all the way to the end of the file.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2008-03-27 17:48 |只看该作者
原帖由 risepp 于 2008-3-27 17:10 发表
哦,知道了,这个是perl设计就是如此的吧,但是为什么要这样做啊? 有什么目的或者好处麽?

这么说吧,如果换成是设计 Java 那帮人设计 Perl,
那么你就不能写
  1. 1;
复制代码

了,你得写:
  1. return isPerlModuleLoadSuccess( True );
复制代码

Perl 认为为了这么一个功能不值得再发明一个关键字,
所以就设计成 return 任意一个真值就可以了。
而最简单的 return 真值的语句就是(注意 Perl 里的块作用域最后一行的 return 是可以省略的):
  1. 1;
复制代码

[ 本帖最后由 flw 于 2008-3-27 17:50 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2008-03-27 20:44 |只看该作者
有些模块在特定环境不能用,就可以返回假,导致加载失败,这样设计是很方便的。比如:

package AAA;
return 0 if ($os eq 'windows);
return 1;

论坛徽章:
6
IT运维版块每日发帖之星
日期:2015-09-05 06:20:00IT运维版块每日发帖之星
日期:2015-09-06 06:20:00IT运维版块每日发帖之星
日期:2015-10-17 06:20:00IT运维版块每周发帖之星
日期:2015-11-06 19:28:13IT运维版块每日发帖之星
日期:2015-11-07 06:20:00操作系统版块每周发帖之星
日期:2015-12-02 15:01:04
8 [报告]
发表于 2008-03-27 22:12 |只看该作者
知道了,谢谢各位的帮忙。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP