如何在palandrome任务中的一行显示用户输入?

时间:2012-03-14 15:52:21

标签: perl

在perl中,我必须确定用户输入是否是回文并且必须显示如下:

Enter in 7 characters: ghghghg #one line here #
Palindrome! #second line answer#

但这就是它的作用:

Enter in 7 characters: g #one line#
h #second line#
g #third line#
h #fourth line#
g #fifth line#
h #sixth line#
g  Palindrom

e! #seventh line#

我的问题似乎是在所有变量的chomp线上,但我只是无法弄清楚该做什么,而且我已经在几个小时了。我需要一个简单的解决方案,但还没有进展到数组,所以需要一些简单的解决方案。感谢

这就是我到目前为止,这个公式似乎有用,但它会为每个角色打印一个新行:

use strict; 
use warnings;

my ($a, $b, $c, $d, $e, $f, $g);
print "Enter in 7 characters:";

chomp ($a = <>); chomp ($b = <>); chomp ($c = <>); chomp ($d = <>); chomp ($e = <>); chomp ($f = <>); chomp ($g = <>);

if (($a eq $g) && ($b eq $f) && ($c eq $e) && ($d eq $d) && ($e eq $c) && ($f eq $b) && ($g eq $a))

{print "Palindrome! \n";}
else
{print "Not Palindrome! \n";}

3 个答案:

答案 0 :(得分:3)

如果您要确定某个单词是否向后相同,我建议您使用reverselc吗?

chomp(my $word = <>);
my $reverse = reverse $word;

if (lc($word) eq lc($reverse)) {
    print "Palindrome!";
} else {
    print "Not palindrome!";
}

答案 1 :(得分:1)

use strict;
use warnings;
use feature 'say';

print "Please enter 7 characters : ";

my $input = <>;    # Read in input
chomp $input;      # To remove trailing "\n"

# Season with input validation
warn 'Expected 7 characters, got ', length $input, ' instead'
  unless length $input == 7;

# Determine if it's palindromic or not

say   $input eq reverse $input
    ? 'Palindrome'
    : 'Not palindrome' ;

TIMTOWTDI易于递归:

sub is_palindrome {

    return 1 if length $_[0] < 2;   # Whole string is palindromic

    goto \&is_palindrome
      if substr $_[0], 0, 1, '' eq substr $_[0], -1, 1, ''; # Check next chars

    return;                          # Not palindromic if we reach here
}

say is_palindrome( 'ghghghg' ) ? 'Palindromic' : 'Not palindromic' ;

对于那些不是的人perldoc perlretut:)

  

递归模式

     

此功能(在Perl 5.10中引入)显着扩展了功能   Perl的模式匹配。通过引用其他一些捕获组   模式中具有构造(?group-ref)的模式中的任何位置   在引用的组中用作独立的子模式   组引用本身的位置。因为组参考可能   被包含在它所指的组中,现在可以   将模式匹配应用于迄今为止需要递归的任务   解析器。

     

为了说明这个功能,我们将设计一个与a匹配的模式   字符串包含回文结构。 (这是一个单词或句子,   忽略空格,插入和案例,读取相同   向后转发。我们首先观察空字符串或   只包含一个单词字符的字符串是回文结构。除此以外   它必须在前面有一个单词字符,在结尾处必须有相同的字符   中间的另一个回文。

/(?: (\w) (?...Here be a palindrome...) \g{-1} | \w? )/x
     

在两端添加\W*以消除要忽略的内容,我们   已经有完整的模式:

my $pp = qr/^(\W* (?: (\w) (?1) \g{-1} | \w? ) \W*)$/ix;
for $s ( "saippuakauppias", "A man, a plan, a canal: Panama!" ){
    print "'$s' is a palindrome\n" if $s =~ /$pp/;
}

答案 2 :(得分:1)

Perl因其TIMTOWTDI而闻名。以下是另外两种方法:

print "Enter 7 characters: ";
chomp(my $i= <STDIN>);

say "reverse: ",  pal_reverse($i) ? "yes" : "no";
say "regex: ", pal_regex($i) ? "yes" : "no";

sub pal_reverse {
    my $i = (@_ ? shift : $_);
    return $i eq reverse $i;
}

sub pal_regex {
    return (@_ ? shift() : $_) =~ /^(.?|(.)(?1)\2)$/ + 0;
}