2014-11-20 2 views
0

Я хочу прокомментировать (на самом деле для печати в разные файлы) диапазон строк в одном файле (DATA), который соответствует другому файлу (rangefile). Rangefile является рядами, то есть, если у меня есть следующие строкиПрокомментировать различные диапазоны значений в файле - Perl

2 4 
7 8 

Я хочу, чтобы закомментировать матчи 2, 3, 4 и 7, 8 в DATA. То, что я до сих пор это:

#!/usr/bin/perl 

use warnings; 
use strict; 

my $rangefile = $ARGV[0]; 

open (RANGE, $rangefile) or die "Couldn't open $rangefile: $!\n"; 
my %hash; 
while (<RANGE>) { 
     my ($begin, $end) = split;; 
     $hash{$begin} = $end; 
} 
close RANGE; 

my %seen; 
while (<DATA>) { 
     if (/^[^\d]/) { next } 
     # just split into an array because this file can have several fields 
     # but want to match 1st field 
     my @array = split;  

     foreach my $key (keys %hash) { 
       my $value = $hash{$key}; 
       if ($array[0] >= $key && $array[0] <= $value) { 
         unless ($seen{$array[0]} ++) { 
           print "#$_"; 
         } 
       } 
       else { 
         unless ($seen{$array[0]} ++) { 
           print; 
         } 
       } 
     } 
} 

__DATA__ 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Но этот код либо печатает # 2, # 3 и # 4 или # 7 и # 8, но никогда и колеблется вместе. Wanted выход:

1 
#2 
#3 
#4 
5 
6 
#7 
#8 
9 
10 

ответ

2

Ваш %hash фактически должны удерживать клавиши (цифры), которые вы хотите, чтобы префикс #

#!/usr/bin/perl 

use warnings; 
use strict; 

# my %hash = (2,4,7,8); 
my ($rangefile) = @ARGV; 

open (my $RANGE, "<", $rangefile) or die "Couldn't open $rangefile: $!\n"; 
my %hash; 
while (<$RANGE>) { 
     my ($begin, $end) = split; 
     @hash{$begin .. $end} =(); 
} 
close $RANGE; 

while (<DATA>) { 
     my ($num) = /^(\d+)/ or next; 
     s/^/#/ if exists $hash{$num}; 
     print; 
} 

__DATA__ 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
+0

Да, это, кажется, умное решение. – PedroA

Смежные вопросы