以下是我正在运行的两个文件的内容:
Secure.cgi
MyModule.pm
MyModule.pm中的“sub scrub {}”子程序是Secure.cgi中的子程序,但我想 将其作为单独的模块运行。
作为Secure.cgi中的一个子程序,“sub scrub”工作得很好,但当我把它移动到 MyModule.pm,它不起作用 - 毫无疑问是因为我错误地调用它,并且 可能在模块中有错误。
这是我第一次尝试创建模块。测试时“打印”功能正常工作 MyModule.pm,所以我知道它已正确安装。
任何良好的反馈将不胜感激。
SECURE.CGI
#!/usr/bin/perl
use MyModule;
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
### DATA VALIDATION IN MYMODULE.PM IS NOT OCCURRING#######
$value = MyModule->scrub;
##########################################################
##### THIS WORKED WHEN "SCRUB" WAS EMBEDDED IN THIS SCRIPT #######
##&scrub;
$userdata{$name} = $value;
}
$id1=$userdata{id1};
$id2=$userdata{id2};
print "Content-type:text/html\r\n\r\n";
print"
<BR>
<Table align=center width=1000 border=1 cellpadding=4 cellspacing=0>
<TR><TD align=center>
<form action=\"http://###myserver###\" method=post>
<table border=1 bgcolor=#EAEAEA>
<TR><TD align=center colspan=3><B>Input Form</b></td></tr>
<TR><TD align=center><b>ID1</b><BR><input type=text name=id1></td></tr>
<TD align=center><b>ID2</b><BR><input type=text name=id2></td></tr>
<TD align=center><input type=submit value=submit name=submit></td></tr>
</table>
</form>
<BR>
<table border=1 bgcolor=#EAEAEA >
<TR><TD align=center><B>Form Output</b></td></tr>
<TR><TD align=center><b>ID1</b></td></tr>
<TR><TD bgcolor=white align=center> $id1</td></tr>
<TR><TD align=center><b>ID2</b></td></tr>
<TR><TD bgcolor=white align=center> $id2</td></tr>
</table>
</TD></TR></table>
<BR>
</body> </html>";
=======================================
MYMODULE.PM
package MyModule;
sub scrub {
$value =~ s/.html|.htm|.cgi|.php//g;
$value =~ s/\///g;
$value =~ s/&|$|@|'|"|<|>|\^|\(|\)|=//g;
$value =~ s/onmouseup|onreset|onselect|onsubmit|onunload//g;
return $value;
}
1;
答案 0 :(得分:3)
代码有这么多错,我不知道从哪里开始。我会把关于风格和技术的警告留给花生画廊。
问题是子例程使用外部作用域中的变量,但是当子例程移动到另一个包中时,该例程就消失了。改变子程序,使其改为参数。