有这个演示CGI脚本(cgi_script.pl
)
use 5.014;
use warnings;
use CGI;
my $q = CGI->new();
say $q->h1( join '-', $q->multi_param('p') );
say CGI::h1('some other');
以perl cgi_script.pl p=1 p=2
打印
<h1>1-2</h1>
<h1>some other</h1>
我想要创建My::CGI
,它应该完成CGI
所做的一切。现在我有:
package My::CGI;
use 5.014;
use warnings;
use base qw(CGI);
1;
修改上述脚本(my_script.pl
)
use 5.014;
use warnings;
use My::CGI;
my $q = My::CGI->new();
say $q->h1( join '-', $q->multi_param('p') );
say My::CGI::h1('some other');
当它以perl my_script.pl p=1 p=2
运行时,它会打印:
<h1>1-2</h1>
Undefined subroutine &My::CGI::h1 called at my_script.pl line 7.
例如,面向对象的界面起作用,但不起作用,如CGI::h1(...)
等。
问题是:如何创建My::CGI
以与父CGI
完全兼容? e.g。
My::CGI::h1(...)
...等use My::CGI qw(:xxx)
#xxx,例如:all
或:html2
等等...... 不需要代码,只需要任何指针/想法,如何正确解决&#34;问题。
答案 0 :(得分:3)
幸运的是,CGI支持:all
代码:
#! /usr/bin/perl
use warnings;
use strict;
{ package MyCGI;
use CGI qw{ :all }; # Import all functions.
use parent 'CGI'; # Inherit the methods.
}
my $q = MyCGI->new;
print $q->h1('Title');
print MyCGI::h2('Section');
答案 1 :(得分:1)
你基本上是自己给出答案的基础。你在谈论sub_classing_。 类表示对象。调用提供功能和面向对象接口的模块的功能接口在继承时需要额外的工作。
Perl的面向对象有一些陷阱。通常,它适用于包命名空间。有CGI
,My::CGI
。如果你说
package My::CGI;
use base 'CGI';
或
package My::CGI;
use parent 'CGI';
你告诉Perl任何幸运到My :: CGI命名空间的东西都有@ISA
中的CGI。那是继承的东西。
但是如果你调用一个简单的函数(不是一个方法),那就被忽略了。只有名称空间。
package My::CGI;
use 5.014;
use warnings;
use base qw(CGI);
1;
此包不会在其命名空间中定义任何subs。所以你不能打电话给他们。它们仍然只位于CGI包中。
您可以先将它们放入您自己的命名空间。
package My::CGI;
use 5.014;
use warnings;
use base qw(CGI);
*h1 = \&CGI::h1;
1;
现在您的示例调用将起作用。
当然这有点乏味。您可以查看符号表,查看条目并使用这些条目自动为所有功能接口sub创建别名。