2014-11-02 27 views
0

我有数组,我想要使用两个相邻元素执行修改元素内容的操作。我不认为map运营商是适合的。例如:操作替换两个相邻的元素,平均他们如果abs(element1-element2) <= 2执行涉及数组中相邻元素的操作的最简单方法

my @arr = (0, 3, 5, 6, 9, 1, 1); 
my @outarr = magic(@arr); 
for(@outarr) 
{ 
    print "$_ "; 
} 

而且我想输出是:0 5 9 1

有没有办法与mapgrep运营商的风采做到这一点?

+0

不,我认为Perl有这样一个任务的许多方面,我想知道聪明的一个。 – DoctorMoisha 2014-11-02 09:46:59

+0

我不明白你描述的算法是如何产生'0,5,9,1'的。有三对由两个或两个以下的不同组成:'(3,5)'(应该用'4'替代),'(5,6)'(应该用'5.5'替换,并且'1 ,1'(应该用'1'代替),我认为这会留下'0,4,5.5 9,1',你如何解释你给出的结果? – Borodin 2014-11-02 10:25:53

+0

(0,3) - >(0, 3),(3,5)→(4),(4,6)→(5),(5,9)→(5,9),(9,1)→(9,1) ,(1,1) - > 1 – DoctorMoisha 2014-11-02 10:45:29

回答

0

通过你的阵列只是重复使用状态变量来构建新的数组:

use strict; 
use warnings; 

my @arr = (0, 3, 5, 6, 9, 1, 1); 

my @outarr; 
my $lastval; 

for (@arr) { 
    if (!defined $lastval) { 
     $lastval = $_; 
    } elsif (abs($lastval - $_) > 2) { 
     push @outarr, $lastval; 
     $lastval = $_; 
    } else { 
     $lastval = ($lastval + $_)/2; 
    } 
} 

push @outarr, $lastval if defined $lastval; 

print "@outarr\n"; 

输出:

0 5 9 1 
相关问题