如何将CGI.pm子类化为完全可行的?

时间:2015-12-11 13:39:46

标签: perl

有这个演示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(...) ...等
  • 并且还从CGI获得工作use My::CGI qw(:xxx) #xxx,例如:all:html2等等......

不需要代码,只需要任何指针/想法,如何正确解决&#34;问题。

2 个答案:

答案 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的面向对象有一些陷阱。通常,它适用于包命名空间。有CGIMy::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创建别名。