2014-05-24 3 views
4

필자가 작성한 코드에서 예상치 못한 결과가 발생했을 때 Schwartz가 "Perl 학습"에서 연습 문제를 해결하려고했습니다. 내가 뭘 잘못했는지 궁금해서.간단한 tac 프로그램 구현

Qn : 유닉스 유틸리티와 유사한 간단한 tac을 구현하십시오.

내 솔루션 :

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

my @array; 
while (<>) { 
    push @array, $_; 
} 

foreach ($#array..0) { 
    print $array[$_]; 
} 

으로 구현 : $ ./tac list

목록에 포함 된 경우 :

$ cat list 
An apple 
Blue boys 
Coy cows 
Dreary ducks! 

에는 출력을 제공하지 않습니다.

$ ./tac list 
$ 
+1

답을 수락 해 주셔서 감사합니다. 내가 좋아할만한 몇 가지 예를 추가했습니다. –

답변

4

귀하의 문제는 foreach 루프 카운터입니다. 그런 식으로 뒤로 갈 수는 없습니다.

대신 할 수있는 : 단지

while (@array) { 
    print pop @array; 
} 

또는 :

print pop @array while (@array); 

while (@array) 배열의 크기가 테스트됩니다 것을 의미 스칼라 문맥@array을 평가합니다. 크기가 0에 도달하면 루프가 종료됩니다.


이것은 perl이므로 당연히이 작업을 수행하는 데 백만 가지 방법이 있습니다.

print for reverse @array 

... 또는 거꾸로 unshift를 사용하여 배열에 읽을 수 있습니다 : 또 다른 것

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

my @array; 
while (<>) { 
    unshift @array, $_; 
} 

print for @array; 

를 ... 아니면 그냥 할도 수 :

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

print reverse <>; 

Perl을 배우십시오!

+0

@TLP 편집 해 주셔서 감사합니다. 왜 나는'map'을 그곳에 사용했는지 모르겠습니다. 특히 다음 예제에서'print for @ array'를 한 이후 로요. –

+0

반갑습니다. – TLP

+1

'print reverse <>'는 경로에'tac '이없는 커맨드 라인을위한 훌륭한 한 줄입니다. – willkil

2

범위 표기는 카운트 다운되지 않습니다

$ perl -e 'foreach my $i (10..0) { print "$i\n"; }' 
$ 

당신은 사용할 수 있습니다

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

my @array = <>; 

foreach (0..$#array) 
{ 
    print $array[$#array - $_]; 
} 
1

foreach 루프에서 카운트 다운 할 수 없습니다. reverse을 사용하여 동일한 작업을 수행 할 수 있습니다.

my @array = <>; 

foreach (reverse 0..$#array) 
{ 
    print $array[$_]; 
}