2013-11-15 113 views
-1

我新的Perl和我寫了一個腳本尋找像夫人迴文詞。然而,當我試圖做比較以找出這個詞是否是迴文時,它給了我一個錯誤。以下是我的代碼。我對有問題的路線發表了評論。該錯誤消息是Use of uninitialized value $forward[0] in string ne at...Use of uninitialized value $backwards[0] in string ne at...在字符串ne處使用未初始化的值。數組

#!/usr/local/bin/perl -w 

print "Content-type: text/html \n\n"; 
print "<html> \n"; 
print "<head><title>Palindrome</title></head> \n"; 
print "<body><h1>Are the words palindromes?</h1> \n"; 
print "<hr /><pre>"; 

$query_string = $ENV{'QUERY_STRING'}; 

$_ = $query_string; 

s/\W//gi; 
s/\U$_/\L$_/gi; 

@palindrome = split (/=/, $_); 
@backwards = reverse ($palindrome[1]); 
@forward = reverse ($backwards[0]); 
$sizePal = @forward; 

for ($i = 0; $i < $sizePal; $i++) { 
    if ($forward[$i] ne $backwards[$i]) { # PROBLEMATIC LINE 
     $result = ""; 
     last; 
    } 
    else { 
     $result = "true"; 
    } 
} 

if ($result eq "true") { 
    print "\n", $query_string, "is a palindrome \n"; 
} 
else { 
    print "\n", $query_string, "is a not palindrome \n"; 
} 
+0

總是'使用嚴格的;' – fugu

回答

0

總是'嚴格使用';'而不是!# /usr/bin/perl -w。使用use warnings;。它更加靈活。我改寫了你的程序:

這裏的一些其他提示:

  • 不要使用$_當你不就得了。還有,因爲它全球性質與$_問題。它必須與mapgrep使用,並患有shift使用它,但大多數時候,你最終不得不走這無論如何分配給別的東西,所以它不會做什麼是該做的:讓你的程序更易讀。在你的情況下,你會得到一個輸入,然後將它分配給$_。沒有必要這樣做。

該作品一樣好:

$query_string =~ s/\W//gi; 
$query_string =~ s/\U$_/\L$_/gi; 
  • 你得到陣列標量混合起來。

此:

my @forward = reverse ($backwards[0]); 

被平息你的字符串$backwards[0]$forward[0]。沒有$forward[1]。整個字符串被分配給數組的第一個元素。

也許你想這樣做:

my @forward = split //, reverse ($backwards[0]); 

這種拆分每個字母串reverse ($backwards[0],並把每個字母爲@forward

我不知道輸入的是什麼。你爲什麼分裂=?用戶是否進入迴文記錄?

whatisit=tisitahw 

或者這樣:

madam, I am Adam. 

如果是後者,爲什麼要通過所有的conniptions的?

#! /usr/bin/env perl 

use strict; 
use warnings; 
use feature qw(say); 


print "Enter String: "; 
chomp (my $query_string= <STDIN>); 

$query_string =~ s/[\W_]//g; 

if (lc $query_string eq lc reverse $query_string) { 
    say "Hey, that's a palindrome"; 
} 
    say "No, it's not a palindrome"; 
} 

我使用s/[\W_]//g刪除所有空格和其他非字母的東西。它確實保留數字。 [\W_]是必需的,因爲\W不包含下劃線。末尾的g表示根據需要在字符串中多次執行此操作,而不僅僅是第一次出現。

然後,我所要做的就是比較大寫字符串與其反轉的自我。不需要通過一個數組。 reverse函數爲您處理所有事情。唯一的問題是這是破壞性的,因爲我將輸入字符串混淆了,所以它與程序結束時的用戶輸入不匹配。

$ program.pl 
String: Madam I am Adam. 
No, it's not a palindrome 
$ 

$ program.pl 
String: Madam I'm Adam. 
Hey, that's a palindrome 

你應該做的是使之成爲一個功能:

#! /usr/bin/env perl 

use strict; 
use warnings; 
use feature qw(say); 

print "Enter the string: "; 
(my $string = chomp <STDIN>); 

if (palindrome($string)) { 
    say "Hey, $string is a palindrome"; 
} 
    say "Sorry, $string is not a palindrome"; 
} 

sub palindrome { 
    my $palindrome = shift; 
    $palindrome =~ s/[\W_]//g; 

    if (lc $palindrome ne lc reverse $palindrome) { 
     return; # Not a palindrome 
    } 
    return $palindrome; 
} 
2

您分配一個值只對數組的一個成員:

@backwards = reverse ($palindrome[1]); 

你可能是指

@backwards = reverse @palindrome; 

但是,爲什麼不

print "$string "; 
if ($string eq reverse $string) { 
    print "is"; 
} else { 
    print "is not"; 
} 
print " a palindrome.";