【问题标题】:Undefined subroutine &main::header called at /opt/alu-rp/www/cgi/munin-cgi-html在 /opt/alu-rp/www/cgi/munin-cgi-html 调用的未定义子例程 &main::header
【发布时间】:2021-04-16 16:57:56
【问题描述】:

我面临错误“在 /opt/alu-rp/www/cgi/munin-cgi-html 第 54 行调用的未定义子例程 &main::header。”打开 munin 页面时(http://localhost/munin)

Perl 版本:v5.32.0 穆宁版本:v2.0.65

由于在munin-cgi-html中添加了新的条件,能够看到header没有被启动

# grab config
html_startup(\@params);
while(new CGI::Fast){
    print header("text/html");
    $config = get_config(1);
    show_page();
}
:
:
# CGI in perl 5.20 is now seriously broken as it doesn't import into the namespace.
# So we have to delegate explicitly. It's easier than prefixing with CGI:: each use.
# This workaround is applied only if "header" is undefined (i.e. for perl >= 5.20).
if(!defined &header){
        *header = sub { return CGI::header(@_); };
        *path_info = sub { return CGI::path_info(@_); };
        *url = sub { return CGI::url(@_); };
        *script_name = sub { return CGI::script_name(@_); };
}

在munin-cgi-html中添加一行可以解决问题。

sub header { return CGI::header(@_); }

但不确定添加此行会有什么影响。 是否需要安装任何特定配置或软件包才能让 Munin 工作?

【问题讨论】:

    标签: perl cgi munin


    【解决方案1】:

    底部的块正在从 CGI 导入符号。不幸的是,您在执行此块以导入它之前尝试使用header。您需要在所有使用 header 等之前执行导入。


    注意

    *header = sub { return CGI::header(@_); };
    

    最好写成

    *header = \&CGI::header
    

    因为它避免了不必要的额外子调用。


    请注意,您可以要求 CGI.pm 为您导出这些符号。您可以简单地使用以下任一符号,而不是手动导入符号:

    use CGI qw( header path_info url script_name );
    
    use CGI qw( :cgi );
    

    无需自己笨拙地导入符号。

    【讨论】:

    • 您可能应该提到,一旦正确完成导入,整个if (!defined &header) {...} 块可以被丢弃。
    • @tobyink 回答时我并没有完全清醒。我已经重写了我的答案,以便为这个问题提供更好的答案。
    • 谢谢,确实有效。但我正在寻找的是我是否在 Munin 安装中缺少与 perl 相关的任何配置/perl 模块。由于特定的 munin-cgi-html 文件是 Munin 的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2011-10-08
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多