[英]How do I check a palindrome in Perl?
我正在尝试在Perl中编写回文检查器。 如果输入的向前和向后相同,则应该返回"true"
。
例:
./determine kayak
True
./determine "Do geese see God?"
True
./determine "Do ducks see God?"
False
我的代码:
#!/usr/bin/perl -w
$name = $ARGV[0];
$name = lc $name;
$name =~ s/[^a-z]//g;
@all = split //,$name;
$half = $#all/2;
foreach $i (0..$half){
my $count = 0;
if($all[$i] eq $all[-($i+1)]){
#print"$all[$i]\n";
#print"$all[-($i+1)]\n";
print "true\n";
last;
}else{
print "flase\n";
}
}
阅读全部后无法确定是非。
例如:当读到: "Do ducks see God?"
,前两个字母相同,因此将输出true,但这应该是false。
您的代码仅检查第一个字母,然后如果相同则停止循环。 您已正确识别出该问题。 这是因为last
。
foreach $i (0..$half){
my $count = 0;
if($all[$i] eq $all[-($i+1)]){
print "true\n";
last; # <-- here
}else{
print "flase\n";
}
}
这将使Perl退出循环。 您要做的是继续检查每个字母。 一旦到达中间位置,您的结果就是正确的,因为字符串是回文 。 但是一旦发现不匹配,就必须失败并退出。
您可以通过将状态保留在变量中,然后进行检查来做到这一点。 我添加了strict
和warnings
,并使代码短了一些。
my $name = lc 'Do ducks see God?';
$name =~ s/[^a-z]//g;
my @all = split //, $name;
my $half = $#all / 2;
my $is_palindrome = 1;
foreach my $i ( 0 .. $half ) {
my $count = 0;
if ( $all[$i] ne $all[ -( $i + 1 ) ] ) {
$is_palindrome = 0;
last;
}
}
if ($is_palindrome) {
print "true\n";
} else {
print "false\n";
}
使用ne
check会更容易,因为在if
之后添加一个空块会造成混淆。
if ( 1 == 0 ) {
} else {
# do stuff
}
它更容易扭转的条件和摆脱块,或使用unless
,这是一样的, 如果不是在Perl。
if ( 1 != 0 ) {
# do stuff
}
unless ( 1 == 0 ) {
# do stuff
}
请注意,有一种更短的实现方式:您可以将字符串与其reverse
进行比较。 当在标量上下文中调用内置的reverse
函数时,会reverse
字符串。
my $name = lc '12321';
$name =~ s/[^a-z]//g;
if ($name eq reverse $name) {
print "true\n";
} else {
print "false\n";
}
当前,对于字符数组的每次迭代,您都打印“ true”或“ false”。 您确实要检查每个字母,只在最后打印结果。
my $is_palindrome = 1;
foreach $i (0..$half){
if ($all[$i] ne $all[-($i+1)]){
$is_palindrome = 0;
last;
}
}
say $is_palindrome ? 'true' : 'false';
但是,就我个人而言,我认为只检查$name
变量与其反向变量相同是容易的。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my $name = $ARGV[0];
$name = lc $name;
$name =~ s/[^a-z]//g;
say $name eq reverse($name) ? 'true' : 'false';
注意:请使用use warnings
而不是-w
并use strict
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.