【问题标题】:Using perl CGI.pm through multiple subroutines通过多个子例程使用 perl CGI.pm
【发布时间】:2016-11-01 03:42:24
【问题描述】:

所以我正在做一个学校项目,我被要求编写 perl cgi 脚本来创建一个社交网站。

我为不同的页面创建了多个子例程,但我的问题是,当我尝试单独执行每个子例程时,它工作正常,但是当我尝试通过其他子例程运行它时,它只是将我重定向到我的第一页.

例如:这是我的新用户页面代码:

    #!/usr/bin/perl -w
    use CGI qw/:all/;
    use CGI::Carp qw/fatalsToBrowser warningsToBrowser/;
    my $cgi = new CGI;

    sub main() {
            print page_header();

            warningsToBrowser(1);

            first();

            page_trailer();
        }


    sub page_header {
            return header(-charset => "utf-8"),
                start_html(-title => 'Matelook',-style => "matelook.css"),
                body({-background =>"background.jpg"}),
                div({-class => "matelook_heading"}, "matelook");
        }

    sub page_trailer {
            my $html = "";
            $html .= join("", map("<!-- $_=".param($_)." -->\n", param())) if $debug;
            $html .= end_html;
            return $html;
        }

    sub new_user {
                  $fullname = param("fullname") || '';
                    $newun = param("newun") || '';
                    $newpass = param("newpass") || '';
                    $email = param("email") || '';
                    $program = param("program") || '';

                if(param("Save")){
                    $data = "full_name=$fullname \n 
                         username=$newun \n
                         password=$newpass \n
                         email=$email \n
                         program=$program \n";


                        $location = "dataset-medium/$newun";
                        mkdir $location, 0755;  
                        open($f,'>',"$location/user.txt");
                        print $f $data;
                        print $data,"\n";
                        print "Data Saved !! ";

                }

                else{
                     print start_form,"\n";
                        print "Enter Full Name :\n", textfield("fullname");
                        print "New Username :\n", textfield('newun'),"\n";
                        print "New Password :\n", textfield('newpass'),"\n";
                        print "Email:\n",textfield('email'),"\n";
                        print "Program:\n",textfield('program'),"\n";
                        print submit({-name =>"Save",-class => "matelook_button"});
                        print end_form,"\n";       
                }
            }

    sub first{
            if(param("New User")){
                new_user();
            }
            else{
                print start_form,"\n";
                   print submit({-class => "matelook_button_first ",-name => 'New User'}),"\n";
                print end_form,"\n";
            }
        }
    main();

如果我尝试使用子例程“first”调用相同的子例程并单击“保存”按钮,它会将我重定向到我调用 new_user 的“First”页面。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 你认为param("New User") 是真的吗?
  • 如 ?你建议我如何修复代码? @xxfelixxx
  • 请提供该问题的最小可运行演示。
  • 另外,首先添加use strict; use warnings qw( all );。您应该在每个程序中使用它。你有许多范围界定错误要修复,谁知道还有什么。
  • 不,您忘记包含 main()first()。我已经修好了。将来,请发布您实际运行的代码。写一个答案。

标签: html perl cgi.pm


【解决方案1】:

您的程序具有以下结构:

sub new_user {
   if (param("Save")){
      save();
   } else {
      show_input_form();
   }
}

if (param("New User")){
   new_user();
} else {
   show_menu();
}

问题是输入表单没有设置pararm('New User'),所以点击Save时不会出现new_user


解决方案 1:

在输入表单中添加一个隐藏输入,名称为New User,值为1


解决方案 2:

改变

if (param("New User"))

if (param("New User") || param('Save'))

解决方案 3:

将程序结构改为

if (param("New User")){
   show_input_form();
}
elsif (param("Save")){
   save();
}
else {
   show_menu();
}

【讨论】:

  • 成功了!非常感谢@ikegami
  • 嘿,我对带有参数的子程序感到困惑。我该如何解决? @ikegami
  • @UtkarshAtri:“我对带有参数的子程序感到困惑。我该如何解决?”如果不读懂你的想法,我们就不可能回答这个问题。也许你可以写一个新问题来解释你的困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多