我用谷歌搜索,直到我用完了选项.我一定做错了什么,但我无法弄清楚是什么.(显然我是Perl的新手并继承了这个项目).我只是想看看变量是否等于'Y'.正如您在下面的代码底部看到的那样,我尝试了'eq','='和'=='.除了将新变量设置为等于'eq'操作的结果之外,所有尝试都会导致页面爆炸.字符串测试($ stringtest)的结果似乎是空的,如果不是,我不知道如何测试它.
#!/usr/bin/perl -w
#######################################################################
# Test script to show how we can pass in the needed information
# to a web page and use it to run a program on the webserver and
# redirect its output to a text file.
#######################################################################
require 5; #Perl 5 or greater
require "jwshttputil.pl";
require "jwsdbutil.pl";
# Parse QUERY_STRING
&HTTPGet;
# Parse POST_STRING - NOTE: This CLEARS the post data
&HTTPPost;
print STDOUT "Content-type: text/html\n\n";
print STDOUT "<HTML><BODY>";
$canrun = "Y";
$is4ge = $Data{'is4ge'};
$sYes = "Y";
#Step 1: Check for needed values
if ( !($Data{'user'}) )
{
print "user was not found<br/>";
$canrun = "N";
}
if ( !($Data{'pwd'}) )
{
print "pwd was not found<br/>";
$canrun = "N";
}
if ( !($Data{'is4ge'}) )
{
print "is4ge was not found<br/>";
$canrun = "N";
}
print "$Data{'is4ge'}"; #prints Y
print $is4ge; #prints Y
if ( !($Data{'db'}) )
{
print "db was not found<br/>";
#if (!($is4ge = "Y")) #dies
# $canrun = "N";
#if (!($is4ge eq "Y")) #dies
# $canrun = "N";
#$stringtest = ($is4ge eq $sYes);
#print $stringtest; #displays nothing
#if (($is4ge == $sYes)) #dies
# $canrun = "N";
}
print STDOUT "</BODY></HTML>";
Run Code Online (Sandbox Code Playgroud)
在Perl中,流控制语句体周围的曲线不是可选的.
eq 确实是Perl中的字符串比较运算符.
所以,
if (!($is4ge eq "Y")) {
$canrun = "N";
}
Run Code Online (Sandbox Code Playgroud)
要不就
if ($is4ge ne "Y") {
$canrun = "N";
}
Run Code Online (Sandbox Code Playgroud)
你真的应该使用1而0不是'Y'和'N',因为它们是真的,并且可以更容易地测试错误值.
你对自己的问题有了很好的答案,但指出你自己如何调查这个问题可能会有所帮助.
首先,您对此问题的原始标题是"如何在Apache下的CGI页面中比较两个字符串?" 该标题已得到纠正,因为此问题与CGI或Apache无关,这只是对Perl语法的误解.我知道你最初不可能知道,但是研究这样的奇怪错误的一个好方法是消除尽可能多的并发症.所以忘记CGI和Web服务器 - 只需编写一个简单的Perl程序.
#!/usr/bin/perl
$canrun = 'N';
$is4ge = 'Y';
if (!$is4ge eq 'Y')
$canrun = 'Y';
print $canrun;
Run Code Online (Sandbox Code Playgroud)
运行这个,我们得到:
$ perl testif
Scalar found where operator expected at testif line 7, near ")
$canrun"
(Missing operator before $canrun?)
syntax error at testif line 7, near ")
$canrun "
Execution of testif aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)
这清楚地表明问题是第6行和第7行的语法.这可能足以让你进入Perl语法手册页,在那里你将了解到Perl中的条件语句总是需要在块周围使用大括号.如果没有,您可以添加diagnostics编译指示以获取更多信息.
因此,正如您已经被告知的那样,您的测试格式正确
if ($is4ge ne 'Y') {
$canrun = 'Y';
}
Run Code Online (Sandbox Code Playgroud)
但是这个程序还有一些其他的东西会使它在将来难以维护.基本上,它倾向于落后于Perl最佳实践.
-w时被替换use warnings在Perl 5.6.0(2000年发布)use strict在代码中(这将指出你需要修复的代码中的许多不良做法 - 特别是,你需要声明你的变量).require位于程序顶部的两个库可能会被更好地重写为正确的Perl模块.jwshttpdutil.pl可能是一个自制的CGI解析器,应该用CGI.pm替换.另外,我建议您阅读CGI :: Alternatives,以便使用现代Perl方法更新Web应用程序.您正在使用在上一个千年结束之前过时的技术.