如何遍历Perl CGI脚本中复选框组的所有选中值?

时间:2011-10-12 21:39:39

标签: perl command-line checkbox cgi

我在Windows计算机上运行了xampp测试系统设置。

我有一个小命令行应用程序,我想用a触发 Perl CGI脚本。

我有一个使用Perl创建的表单。有许多复选框和输入框,用户可以在其中键入消息。

这是我到目前为止的代码。我不是任何方式的perl专家,所以那里 可能是这里没有意义的一些事情,或者是出于测试目的

#!"C:\xampp\perl\bin\perl.exe"

#print a standard 200 -level HTTP header
print "Content-Type:text/html\n\n";

print "<html><head><title>Broadcast Message</title></head>\n";
print "<body>\n";

#display form data
#&displayInfo();

print "</body></html>\n";

if ($ENV{REQUEST_METHOD} eq "GET") 
  {
    &formDisplay();
    exit;
  }
#Else process and display back to screen
else
  {
    #&switches();
    &parseform();
    &displayInfo();

    exit;
  }  

#This subroutine will display information without using the HTML document

sub formDisplay
  {
    print qq~

    <FORM METHOD="POST" ACTION="/cgi-bin/broadcast.cgi">
      <h3>Broadcast Message to Domain</h3>
      ***PLEASE NOTE*** This will broadcast a message to ALL machines in the Domain</br></br>
      <TABLE cellpadding=0 cellspacing=1 border=0>
      <TR>
        <TD>Select your target by switch:&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp   </br></TD>
        <TD></TD>
        <TD>Select your target by department:                       </br></TD>
      </TR>
      <TR>
        <TD><input type=CHECKBOX name=517 value="517">   - 517      </br></TD>

        <TD></TD>
        <TD><input type=CHECKBOX name=ACC value="ACC">   - ACC      </br></TD>
      </TR>
      <TR>
        <TD><input type=CHECKBOX name=testfiletxt value="testfiletxt"> - testefiletxt </br></TD>
      </TR>
      </TABLE>
      </br></br>
      Please type the message you wish to broadcast to the Domain: </br>
      <input name="message"></br>

      <input type=SUBMIT name=Send value="Send">
      <input type=RESET name=Reset value="Reset">
    </form>
    ~;
  }

#This subroutine will display information received from a form 
sub displayInfo {
  print "<b>Your Message:</b> </br>  ",         $form{"message"}, "</br>";
  $system_message=$form{"message"};
  #system "sent.exe /u:testmachine \"$system_message\"" ;
  print qq~
  <form>
  <input type="button" value="Back" onclick="history.go(-1);return true;">
  </form>
  ~;
  # Working loop for form hash
  delete $form{'Send'};

  foreach(keys %form) {
  print "$form{$_} </br>";
  }
 ##############################
  $textme=$form{"testfiletxt"}; 
    open( FILE, "< $textme" ) or die "Can't open $filename : $!";

    while( <FILE> ) {
        chomp;
        print "sent.exe $_ ", $form{"message"} , "</BR>";
    }

    close FILE; 

}


sub parseform
  {
    #get data from environment variable
    read STDIN,$qstring,$ENV{"CONTENT_LENGTH"};
    #$qstring = $ENV{'QUERY_STRING'};

    #break data up on ampersands, and store in array
    @pairs = split(/&/, $qstring);

    #start a loop to process form data
    foreach (@pairs) {
    #split field name and value on "=", store in two scalar variables
    ($key, $value) = split(/=/);
    #translate '+' signs back to spaces
    $value =~ tr/+/ /;
    #translate special characters
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    #store data in hash
    $form{$key} = $value;
    }
  }

我遇到的问题是处理已检查过的文本框。

我需要脚本做的是使用用户指定的参数(即复选框和输入框)运行命令行实用程序。

我认为这将如何运作如下:

  1. 我们预先构建了一些文本文件,其中包含我们网络中的Netbios names台计算机,每行一台计算机名称。这些文件将代表交换机,每个交换机文件将包含附加到它的计算机的Netbios名称。我们最终也会将其扩展为成组。

  2. 用户将转到此广播页面并选择他们希望广播的开关。因此,连接到特定交换机的任何计算机都将接收此广播消息。用户还将提供要广播的消息。

  3. 当用户点击“提交”时,有一些事情需要发生。

    • 需要打开表示所选开关的文件,并且需要将用户输入的消息附加到列表中每个Netbios名称的末尾。例如:

    用户提供的netbiosName消息

    • 然后,一旦完成。需要使用我们刚刚按以下格式编辑的文件运行命令行实用程序:

       sent.exe /t:15 /f:$filename
      

    因此,如果用户选择3个开关,则该命令应运行3次

         sent.exe /t:15 /f:swtich1
         sent.exe /t:15 /f:switch2
         sent.exe /t:15 /f:switch3
    
  4. 我应该指出/f“选项告诉sent.exe命令使用需要以特定方式格式化的文件。

    我一次处理一个选项取得了一些成功。

    但是,当用户选择多个复选框时,我会遇到什么。

    如何使用循环轻松处理选中的复选框?

    我可以从&parseform子程序中提取这个吗?或者有更简单的方法吗?

1 个答案:

答案 0 :(得分:4)

使用CGI.pm

my @checked = $cgi->param('department');

将为您提供名称为“department”的所有选中复选框。为此,您需要清理HTML:

<input type="checkbox" name="department" value="517" 
 id="department_517"><label for="department_517">517</label>

<input type="checkbox" name="department" value="ACC" 
 id="department_ACC"><label for="department_ACC">ACC</label>

<input type="checkbox" name="department" value="testfiletxt" 
 id="department_testfiletxt"><label 
 for="department_testfiletxt">testfile.txt</label>
相关问题