如何使用Perl比较两个字符串

Bel*_*ris 1 perl

我用谷歌搜索,直到我用完了选项.我一定做错了什么,但我无法弄清楚是什么.(显然我是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)

ike*_*ami 6

在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)

你真的应该使用10不是'Y''N',因为它们是真的,并且可以更容易地测试错误值.


Dav*_*oss 5

你对自己的问题有了很好的答案,但指出你自己如何调查这个问题可能会有所帮助.

首先,您对此问题的原始标题是"如何在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替换.
  • 代码中嵌入的HTML应该替换为某种模板引擎.

另外,我建议您阅读CGI :: Alternatives,以便使用现代Perl方法更新Web应用程序.您正在使用在上一个千年结束之前过时的技术.