在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";}
答案 0 :(得分:3)
如果您要确定某个单词是否向后相同,我建议您使用reverse
和lc
吗?
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;
}