2012-03-14 63 views
0

在Perl中,我要確定用戶的輸入是否是迴文與否,它必須顯示如下:如何在palandrome分配中的一行顯示用戶輸入?

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";} 
+1

''''讀取一行(而不是一個字符)。你應該只做一次* <*'*。 – Cameron 2012-03-14 15:57:22

回答

3

如果你要確定一個字是一樣的倒退,我可以建議使用reverselc

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

if (lc($word) eq lc($reverse)) { 
    print "Palindrome!"; 
} else { 
    print "Not palindrome!"; 
} 
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)的模式中的任何地方的某個其他捕獲組 ,引用組內的模式 被用作組引用本身的 位置中的獨立子模式。因爲組引用可能包含在它引用的組中,所以現在可以將 應用模式匹配應用到迄今爲止需要遞歸解析器的任務。

爲了說明這個特性,我們將設計一個與 字符串包含迴文的匹配模式。 (這是一個單詞或一句話, 雖然忽略空格,交織字符串和大小寫,但是同樣向前讀 。我們首先觀察空字符串或 只包含一個單詞字符的字符串是否是迴文。否則 它必須有一個單詞字符前面,並在其結束一樣,用 隔着其他迴文

/(?: (\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/; 
} 
+0

你應該做一個不區分大小寫的比較。 – TLP 2012-03-14 16:09:05

+0

@TLP:嚴格來說,是的,但它看起來並不像OP指定的那樣 – Zaid 2012-03-14 16:12:42

+0

我必須滿足的一個要求是創建我自己的方式來確定它是否是不使用反轉函數的palandrome。所以,從你的評論中,我只能使用<>一次? – Rachel 2012-03-15 22:25:10

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; 
} 
相關問題