The following script gives the output you want. I'm not sure it does it in the desired way, though, as you haven't described how exactly to get the value.
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my ($START, $END, $SIZE) = (1, 1524, 150);
my @range;
while (my $line = <DATA>) {
my ($pos, $from, $to) = split / |\.\./, $line;
if ($START == $from && $END == $to) {
@range[$pos .. $SIZE + $pos - 1] = (1) x $SIZE;
}
}
say scalar grep $_, @range;
__DATA__
46 1..1524
832 1..1524
1008 1..1524
1407 1..1524
2360 2052..3260
2967 2052..3260
403 1..1524
800 1..1524
2986 2052..3260
3170 2052..3260
UPDATE Moreover, it seems your description ("Making the array 1 if it contains the position+150 else the array is set to 0") should produce a different output, as you only want to count the part of the 1407 that overlaps 1..1524. The following code does that, and show an alternative approach, without using the array - it uses a hash to remember the positions where the state of the element would change.
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use Syntax::Construct qw{ // };
my ($START, $END, $SIZE) = (1, 1524, 150);
my %borders;
while (my $line = <DATA>) {
my ($pos, $from, $to) = split / |\.\./, $line;
if ($START == $from && $END == $to) {
$borders{$pos}++;
$borders{ $pos + $SIZE + 1 }--;
}
}
my ($sum, $step) = (0, 0);
for my $i ($START .. $END) {
$step += $borders{$i} // 0;
$sum++ if $step;
}
say $sum;
__DATA__
46 1..1524
832 1..1524
1008 1..1524
1407 1..1524
2360 2052..3260
2967 2052..3260
403 1..1524
800 1..1524
2986 2052..3260
3170 2052..3260
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,