2011-12-22 3 views
2

그 안에 동일한 데이터가 들어있는 두 배열간에 어떤 요소가 변경되었는지 확인하고 싶습니다.두 배열의 값이 다른 인덱스는 어떻게 찾을 수 있습니까?

@prev=("0","1","0","1"); 
@curr=("0","1","0","0"); 

위의 두 어레이에서 명확하게 배열의 마지막 요소가 변경되었습니다.

배열의 색인을 변경해야한다는 것을 알고 있다면 특정 요소 만 변경되어 나머지는 변경되지 않아야한다는 것을 어떻게 알 수 있습니까?

my @indices_of_change = grep { $prev[$_] ne $curr[$_] } 0 .. $#prev; 

를 들면 :

답변

2

는 값이 변경 인덱스를 확인하려면 로 : 물론

my @prev = (0, 1, 0, 1); 
my @curr = (0, 1, 0, 0); # @indices_of_change == (3); 

, 거기에 몇 가지주의 사항이 붙어 있습니다

  • 는 같은 길이로되어 @curr@prev 있습니까? 그렇지 않은 경우 예상되는 행동은 무엇입니까?
  • DWIM의 컨텍스트를 명확히해야합니다. 문자열이 배열 안에 있어야합니까? '00''0'과 같아야합니까?
+0

은 YES 그들은 모두 대문자를 사용하지 마십시오 같은 길이 – monucool

+0

@monucool의이다. 네가 외치는 것 같아. – TLP

+0

죄송합니다. 다음 번에 치료하겠습니다. – monucool

1

List::MoreUtils의 zip 함수를 사용하여 이와 같은 비교를 할 수 있습니다. zip을 사용하면 동일한 길이가 아닌 배열을 사용할 수 있다는 장점이 있습니다.

use List::MoreUtils qw/zip/; 
my @changed = 
    map { $_[0] != $_[1] } 
     zip @prev, @curr; 
+0

나는 다음과 같은 error-rray를 발견했다. print.pl 라인 10, 라인 끝 (누락 연산자 이전?) Printing.pl 행 10의 List :: MoreUtils :: mesh에 대한 인수가 충분하지 않다. "@prev @curr" "@prev @curr"근처의 printing.pl 줄 10에서 구문 오류가 발생했습니다. 컴파일 오류로 인해 printing.pl이 중단되었습니다. – monucool

+0

'@ prev'와 @curr 사이에 쉼표를 추가하십시오. – choroba

0

Data::Difference을 사용하여 배열을 비교할 수 있습니다. 그리고 그것은 여러분의 필요에 반환 된 DIFF을 난도질하는 것은 매우 쉽습니다 :

use strict; 
use warnings; 

use Data::Difference qw(data_diff); 
use Data::Dumper; 
my @prev = ("0", "1", "0", "1"); 
my @curr = ("0", "1", "0", "0"); 

my @diff = data_diff (\@prev, \@curr); 
my @indices_of_change = map { @{ $_->{ 'path' } } } @diff; 
print Dumper (\@indices_of_change); 
+0

Difference.pm 모듈을 얻는 방법.? – monucool

+0

모듈을 설치하는 방법에는 여러 가지가 있습니다. [cpan.org의 지침] (http://www.cpan.org/modules/INSTALL.html)을 참조하십시오. –

2

당신이 Array::Compare가 작성된 이유는 정확히, 내 자신의 모듈을 포주 괜찮다면.

#!/usr/bin/perl 

use strict; 
use warnings; 

use 5.010; 
use Array::Compare; 

my @prev = qw(0 1 0 1); 
my @curr = qw(0 1 0 0); 

my $cmp = Array::Compare->new; 

my @diffs = $cmp->full_compare(\@prev, \@curr); 

say "Difference at these indexes: @diffs"; 
+1

이 모듈을 다시 작성해야한다면 여전히 '무스'를 사용 하시겠습니까? – Zaid

+0

물론입니다. 내가 할 수있을 때마다 나는 무스를 사용한다. –

관련 문제