#!/usr/bin/perl -w use strict; my $data = '4 NULL NULL NULL 5 1 NULL NULL 2 NULL 6'; my @data = split(/\s+/,$data); my $iFirstNULL; my $cur_index=0; foreach (@data) { if (my $num = /NULL/.../\d/) { $iFirstNULL = $cur_index if $num == 1; insertValues($iFirstNULL-1,$cur_index,\@data) if $num =~ /E0/; } $cur_index++; } print "@data"; #prints 4 4 4.5 5 5 1 1 2 2 4 6 sub insertValues { my ($istart, $iend, $aref) = @_; my $pos = $istart+1; my $beginNum = $aref->[$istart]; my $endNum = $aref->[$iend]; while ($aref->[$pos] eq 'NULL') { if ($pos-$istart < $iend-$pos) # closer to start { $aref->[$pos] = $beginNum; } elsif($pos-$istart > $iend-$pos) # closer to end { $aref->[$pos] = $endNum; } else # directly in middle { $aref->[$pos] = ($endNum + $beginNum)/2; } $pos++; } }