如何在Perl CGI脚本中遍历复选框组的所有选中值?
我有一个在Windows机器上运行的测试系统设置 我有一个小的命令行应用程序,我想使用 Perl CGI脚本 我有一个使用Perl创建的表单。用户可以在许多复选框和输入框中键入消息 这是我目前掌握的代码。我无论如何都不是perl方面的专家,所以 这里可能有一些没有意义的东西,或者是为了测试的目的如何在Perl CGI脚本中遍历复选框组的所有选中值?,perl,command-line,checkbox,cgi,Perl,Command Line,Checkbox,Cgi,我有一个在Windows机器上运行的测试系统设置 我有一个小的命令行应用程序,我想使用 Perl CGI脚本 我有一个使用Perl创建的表单。用户可以在许多复选框和输入框中键入消息 这是我目前掌握的代码。我无论如何都不是perl方面的专家,所以 这里可能有一些没有意义的东西,或者是为了测试的目的 #!"C:\xampp\perl\bin\perl.exe" #print a standard 200 -level HTTP header print "Content-Type:text/htm
#!"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:             </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;
}
}
因此,如果用户选择了3个开关,则该命令应运行3次
sent.exe /t:15 /f:swtich1
sent.exe /t:15 /f:switch2
sent.exe /t:15 /f:switch3
我应该指出,/f
“选项告诉sent.exe
命令使用需要以特定方式格式化的文件
我在一次处理一个选项方面取得了一些成功
但是,当用户选择多个复选框时,会发生什么情况,这让我感到困惑
如何使用循环轻松处理所选复选框
我可以从&parseform
子例程中提取这个吗?或者有更简单的方法吗?使用:
将给您所有名为“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>
517
行政协调会
testfile.txt
使用:
将给您所有名为“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>
517
行政协调会
testfile.txt
你是在问如果用户选择了多个部门如何处理数据吗?首先,不要像那样手工解析表单数据。使用CGI.pm
或CGI::Simple
。其次,将HTML与代码分开。第三,最重要的是,你将允许任何可以查看网页的人在你的机器上调用另一个程序ine。首先阅读CGI安全常见问题解答:是的,Andrey,我需要根据用户选择来处理数据。Sinan,我以前没有听说过CGI.pm。谢谢你的建议!我必须尝试找到一些将HTML与代码分开的示例。当我第一次学习perl时,我被展示了如何将两者混合在一起。我将不得不放弃学习坏习惯!至于安全性,这是我一直关心的问题。我想让页面启动并运行。一旦我知道我可以让它工作,我将保护该网站。它将只用于我们的本地网络,需要身份验证和任何其他安全措施来帮助安全。谢谢你的帮助!你问我怎么做如果用户选择多个部门处理数据?首先,不要像那样手工解析表单数据。使用CGI.pm
或CGI::Simple
。第二,将HTML与代码分开。第三,也是最重要的一点,您将允许任何可以查看网页的人在您的机器上调用另一个程序。阅读CGI security FAQ first:是的,Andrey,我需要根据用户选择来处理数据。Sinan,我以前没听说过cgi.pm。谢谢你的建议!我必须尝试找到一些将HTML与代码分开的例子。当我第一次学习perl时,我被展示了如何将两者混合在一起。我将不得不改掉坏习惯!至于security,这是我一直关注的问题。我想让页面启动并运行。一旦我知道我可以让它工作,我将保护网站。它将只在我们的本地网络上使用,需要身份验证和任何其他安全措施来帮助安全。谢谢你的帮助!谢谢,这很有效!我在usin中举了一个例子g使用param选项,它似乎工作得很好。完成脚本还有很长的路要走,但我认为它是可行的。感谢您的帮助!看看HTML::Template
和CGI::Application
。感谢您接受我的答案。谢谢,这很有效!我举了一个使用param选项的例子,它似乎工作得很好。完成脚本还有很长的路要走,但我认为它是可行的。谢谢你的帮助!看看HTML::Template
和CGI::Application
。谢谢你接受我的回答。
<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>