Chinaunix

标题: 编写package遇到的一个问题 [打印本页]

作者: risepp    时间: 2008-03-27 15:57
标题: 编写package遇到的一个问题
我现在想做的事情是编写一个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;也可以成功调用。不明白是怎么回事,请高手指教!
谢谢了!
作者: flw    时间: 2008-03-27 16:06
parameter.pm did not return a true value at ./test.pm line 2.

其实要的是 true 不一定非要用 1。别的也行。
作者: fengyong    时间: 2008-03-27 16:20
原帖由 risepp 于 2008-3-27 15:57 发表
我现在想做的事情是编写一个package,里面包含一些变量的定义和函数的定义。然后另外一个脚本来调用这个package里面的变量或者方法。
我自己做了一个简单的实验。
parameter.pm:
package parameter;
use st ...


最后那个1 是必需的。每个包都有,返回一个 真的值。
作者: risepp    时间: 2008-03-27 17:10
哦,知道了,这个是perl设计就是如此的吧,但是为什么要这样做啊? 有什么目的或者好处麽?
作者: Nosferatu    时间: 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.
作者: flw    时间: 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 编辑 ]
作者: formalin14    时间: 2008-03-27 20:44
有些模块在特定环境不能用,就可以返回假,导致加载失败,这样设计是很方便的。比如:

package AAA;
return 0 if ($os eq 'windows);
return 1;
作者: risepp    时间: 2008-03-27 22:12
知道了,谢谢各位的帮忙。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2