2015-01-22 6 views
2

perl에서 길이가 같고 예측 가능한 순서가있는 배열의 각 요소를 비교하려면 each_arrayref을 유용 서브 루틴에 추가하거나 직접 사용할 수 있습니다.연산자를 사용한 배열의 간단한 요소 별 비교

use List::AllUtils qw/each_arrayref/; 

my ($arr1, $arr2) = ([10, 31, 12], [20, 21, 14]); 

my $iterate_elems = each_arrayref($arr1, $arr2); 
while (my ($x, $y) = $iterate_elems->()) { 
    say $x lt $y ? "$x is lower " : "$x is higher" ; 
} 

또는 잘라 내기 및 붙여 넣기 한 lineishly :

perl -MList::AllUtils=each_arrayref -E ' 
    my $iter = each_arrayref([10, 31, 12], [20, 21, 14]); 
    while (my ($x, $y) = $iter->()){ 
    say $x lt $y ? "$x lower" : "$x higher"}' 

을하지만이 어색하고 완전히 고장이 아닌 약간을 보인다. 나는 도움이되는 반복 함수 참조로 $iterate_elems과 같은 기술적 인 용어를 사용하려고한다. 아마 나는 그것을 명백하게 보이기에 충분하지 않을 수도 있습니다.

perl6에는 metaoperators이 있습니다. 모든 종류의 상당히 간결하고 멋진 목록 비교 및 ​​munging을 허용합니다. 이것은 perl5에서 연산자 오버로딩을 사용하는 방법이 있어야한다고 생각하게한다. 누구든지이 지혜에 대해 논평 할 수 있습니까? 연산자를 적용하기 위해 목록을 반복하는 대신 일련의 목록에 연산자를 적용하는 방식으로 작성된 코드를 이해하는 것이 더 쉬운 것처럼 보입니다. 아마도 map 또는 List::MoreUtilsapply을 독창적으로 사용하면 같은 효과를 얻을 수 있습니다.

놀라운 perl6 코드 샘플을 환영합니다.

+0

어쩌면 나는 당신의 질문의 요점을 놓치고 있지만 ... 만약 길이가 동일하다면'$ i (0 .. $ # array1) {for $ array1 [$ i ], $ array2 [$ i]; }'? – ThisSuitIsBlackNot

+0

일반적으로 배열이나리스트는 훨씬 더 커질 것이고,'each_arrayref'가 가능하다고 생각하는 요소들에 대한 더 많은 비교를 원할지도 모릅니다. 그러나 가능한 한 더 간단합니다. –

+0

나는 아직도 나는 그것을 얻지 않고 있다고 생각한다. 더 많은 요소를 가진 배열이 더 많은 비교를 할 때 루프의 논리를 어떻게 바꿀까요? 아마도 좀 더 구체적인 예가 있습니다 ... – ThisSuitIsBlackNot

답변

1

List::AllUtils을 사용 중이므로 pairwise은 어떻습니까?

미끄러 '간단한'언급, 나에게 간단하게 보이지만, 같은 문제에 맞는
use List::AllUtils qw(pairwise); 

my @arr1 = (10, 31, 12); 
my @arr2 = (20, 21, 14); 

pairwise { 
    print $a lt $b ? "$a is lower\n" : "$a is higher\n" 
} @arr1, @arr2; 

... 행운을 빕니다!