2017-04-18 37 views
0

我已經搜索了,直到我用完了選項。我一定在做錯事,但我搞不清楚是什麼。 (顯然,我是Perl新手,繼承了這個項目)。 我只是想看看一個變量是否等於'Y'。正如你可以看到下面的代碼底部,我已經嘗試'eq','='和'=='。除了設置等於'eq'操作結果的新變量外,所有嘗試都會導致頁面被炸燬。字符串測試($ stringtest)的結果看起來是空的,如果不是,我不知道如何測試它。我如何使用Perl比較兩個字符串

#!/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>"; 
+2

這段代碼幾乎和我一樣古老。這讓我害怕。 – simbabque

+0

'if($ foo eq'Y'){print「foo is y \ n」; ''是你所需要的。 '$ is4ge =「Y」'總是'「Y」'。比較非數字需要'eq'。你說它死了。什麼是錯誤信息? – simbabque

+0

'if(!($ is4ge =「Y」))'在這裏您將Y分配給$ is4age並且使其成爲「true」 - 賦值成功。 '=='測試兩件事是否「相等」。在這種情況下,你最好使用'if($ is4ge ne'Y')' - 一個字符串比較。但是,正如@simbabque提到的那樣,看不出爲什麼會死,或者下一次測試會死。你的意思是它沒有結果,什麼都不打印? – cbmckay

回答

4

對於您的問題,您有一個很好的答案,但指出您可以自己調查此問題的方式可能很有用。

首先,這個問題的原始標題是「如何比較Apache下CGI頁面中的兩個字符串?」該標題已被更正,因爲這個問題與CGI或Apache無關,這只是對Perl語法的一種誤解。我知道最初你不可能知道,但調查這種奇怪錯誤的一個好方法就是儘可能消除複雜性。所以忘記CGI和Web服務器 - 只需編寫一個簡單的Perl程序即可。

#!/usr/bin/perl 

$canrun = 'N'; 
$is4ge = 'Y'; 

if (!$is4ge eq 'Y') 
    $canrun = 'Y'; 

print $canrun; 

運行此,我們得到:

$ 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. 

這清楚地表明,這個問題是圍繞線6和7的語法,可能足以向您發送到Perl syntax manual page,在那裏你會發現Perl中的條件語句總是需要花括號。如果沒有,您可以添加diagnostics附註以獲取更多信息。

所以,當你已經被告知,爲您的測試正確的格式是

if ($is4ge ne 'Y') { 
    $canrun = 'Y'; 
} 

但也有此計劃,這將使它很難在未來維持一些其他的東西。基本上,它是用Perl的最佳實踐落後的。

  • 您使用-w時所用use warnings在Perl 5.6.0更換(2000年發佈)
  • 您不必在代碼use strict(將在你的代碼指出許多陋習你將要解決 - 特別是,你需要聲明你的變量)。
  • 程序頂部的require d這兩個庫可能會被更好地重寫爲適當的Perl模塊。
  • 我擔心jwshttpdutil.pl可能是一個家庭出爐的CGI解析器,應該用CGI.pm替換。
  • 代碼中的嵌入式HTML應該替換爲某種模板引擎。

此外,我建議您閱讀CGI::Alternatives,以使您掌握最新的Perl編寫Web應用程序的最新方法。你正在使用在上個千年結束之前過時的技術。

+0

非常感謝您耐心等待我的經驗不足和您的出色答案!它似乎是直接的罪魁禍首不是比較運算符,但缺少if語句後面的花括號(doh!)。 我會跟進你推薦的閱讀。 – Belmiris

5

流程控制語句的主體在Perl中不是可選的。

eq確實是Perl中的字符串比較運算符。

所以,

if (!($is4ge eq "Y")) { 
    $canrun = "N"; 
} 

或者只是

if ($is4ge ne "Y") { 
    $canrun = "N"; 
} 

你真的應該使用10代替'Y''N',因爲他們是真正的和虛假的價值觀,可以更很容易被測試。

+0

非常感謝。 – Belmiris