我是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";
}
答案 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>全球性质,$_
存在问题。它必须与map
和grep
一起使用,人们会将其与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;
}