在Perl中,如何测试字符串是否为回文?

fkaflof6  于 2022-12-30  发布在  Perl
关注(0)|答案(4)|浏览(167)

我试图编写一个Perl程序来确定7个字符的用户输入是否是回文。
而不使用任何数组、字符串或反转函数。
预期输出:

Enter in a 7 character item: 1111111
    PALINDROME!

或者

Enter in a 7 character item: 1234567
    NOT A PALINDROME!

这是我目前掌握的情况:

print "Enter in a 7 character item: \n";
my ($a, $b, $c, $d, $e, $f, $g);
chomp ($a=<>); chomp ($b=<>); chomp ($c=<>); chomp ($d=<>);
chomp ($e=<>); chomp ($f=<>); chomp ($g=<>);
if ($a~~$g && $b~~$g && $c~~$e){
    print "PALINDROME!\n";
}
else{
    print "NOT A PALINDROME! \n";
}

不幸的是,这给了我这样的结果:

Enter in a 7 character item:
    1
    1
    1
    1
    1
    1
    1
    PALINDROME!

如果任何人有建议,那将是非常感谢的。
我期待听到你的意见。谢谢!

ukdjmx9f

ukdjmx9f1#

在我看来这是正确的,毕竟1111111是回文!
但是,智能匹配运算符不是一个非常有用的东西,并且您希望在这里测试字符串是否相等,因此使用eq而不是~~
更好的是,我建议您允许用户输入整个字符串,因此

chomp(my $str = <>);

if ( $str eq reverse($str) ) {
     print "PALINDROME!\n";
}
else {
     print "NOT A PALINDROME! \n";
}
wkyowqbh

wkyowqbh2#

不使用reverse

#!/usr/bin/perl
use strict;
use warnings;

my ($word) = @ARGV;

my @chars = split //, $word;
my $palindrome = 1;
for (0..@chars/2-1) {
   $palindrome = $chars[$_] eq $chars[-($_+1)]
      or last;
}

print "$word ".($palindrome ? "is" : "isn't")." a palindrome\n";

用法:

script word
g2ieeal7

g2ieeal73#

没有使用逆向,而是使用正则表达式(和递归)。

sub palyndromeP{
     my $s=shift;
     if (length($s)<2) {return 1}        
     if ($s !~ /^(.)(.*)\1$/) {return 0}
     return palyndromeP($2);
 }
vx6bjr1n

vx6bjr1n4#

变化
$B~~$g到$b~~$f也可能有帮助。

相关问题