2013-04-01 61 views
-3

我正在尝试编写一个Perl程序来确定是否有7个字符的用户输入是回文。在Perl中,如何测试字符串是否是回文?

不使用任何数组,字符串或反向函数。

所需的输出:

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! 

如果有人有建议,那将不胜感激。

我期待听到您的意见。谢谢!

+1

没有相反 - 可能是可行的。没有阵列 - 好吧,也许一些真正的黑色正则表达式可能会有所帮助。但是,嘿,*没有字符串*?我们还在谈论Perl吗? –

+1

顺便说一句,我以为你想要**代码**本身是回文...这将是一个挑战的地狱! –

+3

Palindrome回文检查器(代码游戏):http://codegolf.stackexchange.com/questions/1798/palindromic-palindrome-checker –

回答

5

这对我来说看起来是正确的,毕竟1111111是一个回文。

但是,智能匹配运算符不是一个非常有用的东西,并且您想在此处测试字符串相等性,因此请使用eq而不是~~

更妙的是,我建议您允许用户输入整个字符串,所以

chomp(my $str = <>); 

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

更改

$ B $ ~~克至$ B ~~ $ F也可能有帮助。

3

在不使用reverse

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

my ($word) = @_; 

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

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

用法:

script word 
+0

@SinanÜnür,实际上,它做了一次比所有必要的比较。固定。 – ikegami

0

使用没有反向,但正则表达式(和递归)。

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