【问题标题】:Getting custom code out of CGI.pm从 CGI.pm 中获取自定义代码
【发布时间】:2011-08-26 17:17:41
【问题描述】:

我们有一个用 Perl 编写的自定义站点,它使用了稍微修改过的 CGI.pm 版本。在服务器更新期间,CGI.pm 可能会在更新时被覆盖。我的目标是能够在不影响站点的情况下更新服务器 - 即更改依赖于修改后的 CGI.pm 的代码。不幸的是,我对 Perl 语法或最佳实践不是很熟悉。

这是修改后的 CGI.pmn 的差异(行号与最新版本的 CGI.pm 不同):

--- CGI.pm.orig Tue Nov  7 12:14:09 2006
+++ CGI.pm      Tue Nov  7 12:13:29 2006
@@ -3386,7 +3386,7 @@ sub read_multipart {
               if (defined $self->{'.upload_hook'})
                {
                   $totalbytes += length($data);
-                   &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'});
+                   &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'}, $param, $header{'Content-Type'});
               }
               print $filehandle $data if ($self->{'use_tempfile'});
           }

依赖于这个差异的代码如下:

my %file_hash = ();
my $page = new CGI(\&file_reader, \%file_hash, 0);

my $session = &get_session($page);


foreach my $param_name (keys %file_hash) {
        my $notes_param = $param_name . "_notes";
        &store_file($file_hash{$param_name}, $page->param($notes_param),
                    &get_session_name($session));
}

没有差异,当文件被存储时,$param_name 变量看起来是空的。

处理此问题的最佳方法是什么?正如我之前所说,我的主要目标是简化对服务器的更新;有什么办法吗

a) (最好)让 %file_hash 在不修改 CGI.pm 版本的情况下正常工作 b) 阻止更新 CGI.pm(这是个坏主意)

【问题讨论】:

  • CGI.pm 是一团糟,你是对的,最好不要修改版本。关于您的差异 - 是否有其他部分引用 $param 变量?它包含什么?更好的是,我会废弃修改后的 CGI 并查看问题。你想做什么,为什么需要$file_hash{param_name} 变量?

标签: linux perl ubuntu-10.04


【解决方案1】:

您是否尝试将其提交给 CGI RT 作为所需的改进?将$param\%header(而不是$header{'Content-Type'})传递给回调似乎是合理的。

要回答您的问题,您可以在本地目录中安装 CGI。 PERL5LIB env var 中的目录首先被搜索,因此您的 CGI 版本将被找到,而不是 Ubuntu 安装的那个。

【讨论】:

  • 这听起来很有帮助 - 如何检查 PERL5LIB 环境变量?我假设这是一个 perl 环境变量,因为 'env' 不显示该变量。另外,我在哪里可以找到 CGI RT 队列?对于基本问题,我很抱歉,但我对 Perl 的经验很少。
  • @JohnB,Perl 总是检查它,所以你不需要做任何事情,除了填充它。如果您将 CGI 安装到 ~/perl5/lib(在这种情况下只需将 CGI.pm 放在此处即可),则将 export PERL5LIB="$HOME/perl5/lib" 添加到您的登录脚本中。 PERL5LIB 记录在 perlrun 中。
  • @JohnB,呃,当您的网络服务器运行您的脚本时,这并不能真正帮助您。将use lib "/home/johnb/perl5/lib"; 添加到您的脚本中可以替代使用PERL5LIB
  • 我只是想弄清楚,谢谢你的提示 - 听起来我需要做的就是将 CGI.pm 移动到我们不可访问的库路径。
  • @JohnB,点击原帖“CGI RT”中的“RT”:)
【解决方案2】:

我是 CGI.pm 的维护者。我认为有比使用 CGI.pm 的本地副本更好的选择。相反,创建一个子类,并在您的应用程序中使用 my 子类。它看起来像这样:

package My::CGI;
use parent 'CGI';

sub my_sub_that_modified {
  ...
}

1;

所以,你只需要复制你修改的子程序。然后,当您升级 CGI.pm 时,您可能不需要接触您的应用程序,除非您修改的子例程发生更改。

使用“本地库”选项,您仍然需要手动将安全更新和其他您可能想要的更改合并到本地副本中。子类路线将其最小化。

这种方法的一个例子是Bugzilla::CGI,它对其子类进行了一些更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多