Re-opening the same file over and over isn't very efficient, so why not read the file into memory and work on it there?. splice lets you remove a chunk of lines from an array, and <> lets you read a file into an array.
So, something along these lines should work.
use v5.18; use warnings; use autodie; my @replace = (qw/vss vdd/); open(my $in,'<','input.txt'); my @lines = <$in>; close $in; LOOP: for my $word (@replace) { my $start = -1; for my $i (0..$#lines) { if ($start == -1) { next unless $lines[$i] =~ /Power\s+information\s+for\s+$word\s+/ +; $start = $i; } else { next unless $lines[$i] =~ /}/; splice @lines,$start,$i - $start + 1; redo LOOP; } } } say @lines; # save @lines to temporary file name # rename input.txt to backup.txt # rename temporary file to input.txt
In reply to Re: Remove multiple lines in file if pattern found based on array element, in perl
by RichardK
in thread Remove multiple lines in file if pattern found based on array element, in perl
by MatD
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |