【问题标题】:Undefined subroutine error in perl packageperl 包中未定义的子程序错误
【发布时间】:2015-10-22 11:04:38
【问题描述】:

这是主文件upload.cgi

#!/usr/bin/perl
use strict;
use lib '.';
use XFSConfig;
use XUpload ; 
use CGI::Carp qw(fatalsToBrowser);
use CGI;
use Fcntl ':flock';
use LWP::UserAgent;
use HTTP::Cookies;
use HTML::Form;
use Encode;
        sub xmessage
    {
       my ($msg) = @_;
       &lmsg($msg);
       $msg=~s/'/\\'/g;
       $msg=~s/<br>/\\n/g;
       print"Content-type: text/html\n\n";
       print"<HTML><HEAD><Script>alert('$msg');</Script></HEAD><BODY><b>$msg</b></BODY></HTML>";
       exit;
    }

    sub lmsg
    {
       my $msg = shift;
       open(F,">$c->{htdocs_tmp_dir}/$sid.html");
       print F qq[new Object({"state":"error", "msg":"$msg"})];
       close F;
       &logit($msg);
    }

这个函数调用一个函数

 &XUpload::ProcessFile()

和 XUpload::ProcessFile() 函数调用一个函数 &xmessage("Fatal");在upload.cgi中定义

现在我得到了这个错误

Undefined subroutine &XUpload::xmessage called at Modules/XUpload.pm line 17.

似乎包XUpload根本找不到upload.cgi中定义的函数xmessage

【问题讨论】:

    标签: perl


    【解决方案1】:

    cgi 脚本中的 xmessage 子在 main 包中定义,而 XUpload 模块(显然)在 XUpload 命名空间中运行。

    解决这个问题最终需要了解 Perl 的命名空间和Exporter 模块。但是一个快速而肮脏的解决方法是在XUpload 包中为您的子创建一个别名。将此行添加到您的主脚本中:

    *XUpload::xmessage = *message;
    

    【讨论】:

    • 确实是脏修复。太可怕了X_X
    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多