2014-07-18 2 views
1

어떻게 이전 값으로 다음 값을 뺍니까?perl에서 array 내의 값을 빼는 방법은 무엇입니까?

use warnings; 
use strict; 
my @hus = qw(7 9 12 16 20 21); 
my ($i,$j); 
for($i = 0; $i <= $#hus; $i++){ 
    for($j = 1; $j <= $#hus; $j++){ 
     my $m = $hus[$j]-$hus[$i]; 
     print "$m\n"; 
    } 
} 

이 프로그램에서 출력을 제공합니다. 그러나 2 3 4 4 1과 같은 특정 출력을 기대합니다.이 출력은 9-7 = 2, 12-9 = 3, 16-12 = 4, 20-16 = 4, 21-20 = 1에서 비롯됩니다. 특정 출력을 인쇄하는 방법은 무엇입니까?

답변

2

배열을 한 번만 루프하면됩니다.

use warnings; 
use strict; 

my @hus = qw(7 9 12 16 20 21); 

for (my $i = 0; $i < $#hus; ++$i) { 
    my $m = $hus[$i+1] - $hus[$i]; 
    print "$m\n"; 
} 

는 출력 :

2 
3 
4 
4 
1 
1

당신은 6 개 요소, 또는 더 일반적으로, 당신은 루프 하나에 @hus의 요소 수보다 적은 시간을 필요로 5 반복이 필요합니다. $i은 항상 $j보다 하나가되어야하므로이 중첩 루프 방식은 잘못되었습니다. 수정 됨 :

my ($i,$j); 
for ($j = 1; $j <= $#hus; $j++) { 
    my $i = $j-1; 
    my $m = $hus[$j]-$hus[$i]; 
    print "$m\n"; 
} 

하지만 정리해 봅시다.

for my $i (1..$#hus) { 
    print $hus[$i]-$hus[$i-1], "\n"; 
} 

다음에 감소에도 수 :

say $hus[$_]-$hus[$_-1] for 1..$#hus; 
4

당신은 매우 컴팩트하게이 작업을 수행 할 수 있습니다

use strict; 
use warnings; 

my @hus = qw(7 9 12 16 20 21); 
print $hus[$_] - $hus[$_-1], "\n" for 1 .. $#hus; 

표현 1 .. $#hus 인덱스 1에서 숫자의 목록을 생성합니다 배열의 마지막 요소 @hus. for 루프는이 목록을 통해 현재 값을 특수 변수 $_에 할당합니다. 즉, 관심있는 두 요소는 $_이고 $_-1@hus입니다.

출력 :

2 
3 
4 
4 
1 
+4

이 펄하지 루비처럼 그렇게 할 수 있습니다, 그래서 표시가이 없습니다. '1 .. $ # hus'는 * range * 연산자에 의해 생성 된 *리스트 *입니다. – Borodin

+0

@Bododin 귀하의 의견에 감사드립니다. 제 대답을 편집했습니다. –

+0

감사합니다. 나도 루비 스 플랫처럼 보이지 않아! – Borodin

2

당신은 앞으로의 차이를 계산하는. 그것은

2 3 4 4 1 

업데이트

은 아마 당신이 당신의 질문에 표시 출력을 원하는이

use strict; 
use warnings; 

my @hus = qw(7 9 12 16 20 21); 
my @diff = map { $hus[$_] - $hus[$_-1] } 1 .. $#hus; 
print "@diff\n"; 

출력처럼 매우 간단하게 할 수 있는가? 이

use strict; 
use warnings; 

my @hus = qw(7 9 12 16 20 21); 

print join ', ', map { 
    my ($i, $j) = @hus[$_-1, $_]; 
    sprintf('%d-%d=%d', $j, $i, $j-$i); 
} 1 .. $#hus; 
print "\n"; 

출력

9-7=2, 12-9=3, 16-12=4, 20-16=4, 21-20=1 
관련 문제