在字符串ne中使用未初始化的值。对于数组

时间:2013-11-15 13:08:56

标签: perl

我是Perl的新手,我写了一个脚本来查找像女士一样的回文词。然而,当我尝试进行比较以确定该单词是否是回文时它会给我一个错误。以下是我的代码。我已对有问题的一行发表评论。错误消息为Use of uninitialized value $forward[0] in string ne at...Use of uninitialized value $backwards[0] in string ne at...

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

2 个答案:

答案 0 :(得分:2)

您只为一个数组成员分配一个值:

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

你可能意味着

@backwards = reverse @palindrome;

但是,为什么不呢

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

答案 1 :(得分:0)

始终'使用严格;'而不是!# /usr/bin/perl -w。使用use warnings;。它更加灵活。我改写了你的程序:

以下是其他一些提示:

  • 当您不需要时,请勿使用$_。由于{em>全球性质,$_存在问题。它必须与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.

如果是后者,为什么要经历所有的错误?

#! /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意味着在字符串中根据需要多次执行此操作,而不仅仅是第一次出现。

然后,我要做的就是将大写字符串与其反转的self进行比较。无需单步执行数组。 reverse函数可以为您处理所有事情。唯一的问题是这是破坏性的,因为我munge输入字符串,所以它与程序末尾的用户输入不匹配。

$ 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;
}