2012-03-14 2 views
0

, 나는 사용자 입력이 회문인지 여부를 결정해야하며 다음과 같이 표시해야합니다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

'<>'는 행 (문자가 아님)을 읽습니다.'<>'* once * 만 실행하면됩니다. – Cameron

답변

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의 패턴 매칭의 힘을 상당히 확장시킨다. 어떤 다른 포착 그룹 을 참조 패턴 으로 참조하면 참조 된 그룹 내의 패턴 은 그룹 참조 자체의 장소의 독립된 하위 패턴으로 사용됩니다. 그룹 참조는 참조하는 그룹 내에 이 포함될 수 있기 때문에 이제는 파서가 필요했던 작업에 패턴 일치를 적용 할 수 있습니다.

이 기능을 설명하기 위해 문자열에 회문문이 포함되어있는 경우 일치하는 패턴을 디자인합니다. 공백, 구두점 및 대소 문자를 무시하면서 을 읽는 문장이나 문장은 앞뒤로 동일한 을 읽는 단어 또는 문장입니다. 빈 문자열 또는 한 단어 문자 만 포함 된 문자열이 회문 일 때부터 시작합니다. 그렇지 않으면 그것은 사이에 또 ​​다른 회문과 단어 앞까지 문자 및 끝에서 동일한가 있어야합니다

/(?: (\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

+0

@TLP : 엄밀히 말하자면, 그렇습니다. 그러나 OP가 지정한대로 보이지 않습니다. – Zaid

+0

내 요구 사항 중 하나는 역 기능을 사용하지 않고 palandrome인지 여부를 판단하는 자체 방식을 만드는 것입니다. 그래서, 귀하의 의견에서, 나는 단지 <> 한 번 사용하기로되어 있습니까? – Rachel

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; 
} 
관련 문제