Если вы не хотите использовать однострочник, переписать часть «запись в файл» следующим образом:
my $file = "changed";
open( my $outfh, '>', $file ) or die "Could not open file $file: $!\n";
foreach my $LINE (@LINES) {
my @array = split(/:/,$LINE);
next if $array[0] eq 'HPL_';
print $outfh $LINE;
}
close( $outfh );
Обратите внимание, как вы open()
пишете файл каждый разчерез петлю.Это приводит к тому, что файл содержит только последнюю строку, так как использование open()
с >
означает «перезаписать содержимое файла».Это основная проблема с вашим кодом в его нынешнем виде.
Редактировать: Кроме того, вы хотите очистить свой код.Используйте лексические дескрипторы файлов, как я показал.Всегда добавляйте три строки, которые tchrist разместил в верхней части каждой из ваших Perl-программ.Используйте версию с тремя операторами open()
.Не вносите весь файл в массив, так как если вы попытаетесь прочитать огромный файл, это может привести к нехватке памяти на вашем компьютере.Ваша программа может быть переписана как:
#!perl
use strict;
use autodie;
use warnings FATAL => "all";
my $infile = "myfile.txt";
my $outfile = "changed.txt";
open( my $infh, '<', $infile );
open( my $outfh, '>', $outfile );
while( my $line = <$infh> ) {
next if $line =~ /^HPL_/;
print $outfh $line;
}
close( $outfh );
close( $infh );
Обратите внимание, что с use autodie
вам не нужно добавлять or die ...
к функции open()
, так как прагма autodie
обрабатывает это длявы.