use Data::Dumper; $Data::Dumper::Indent = 0; my $aref1 = [ 'D 4', 'E 6' ]; my $aref2 = [ 'A 0', 'B 1', 'C 2', 'A 3', 'B 4' ]; my $slen = 5; concat($aref1,$slen); # This already give correct result concat($aref2,$slen); # This still incorrect sub concat { my ($aref,$slen)= @_; my @concat; foreach my $i ( 1 .. $#{$aref} ) { my @out = split (" ", $aref->[$i-1]); my @in = split (" ", $aref->[$i]); # value to be put in (intercepted) my $val = $in[1]-$out[1]-$slen; push @concat, ($out[0],$val,$in[0]); } print Dumper \@concat ; return ; }