LINUX.ORG.RU

История изменений

Исправление annulen, (текущая версия) :

В этом коде есть одна операция с потенциально квадратичной сложностью, которую можно очень легко избежать

use strict;

my @result;

my $file = $ARGV[0];
$file && -f $file or die $!;

open (my $input, '<', $file) or die $!;

my $net = '192.168.0.0/24';
while (<$input>) {
  ! m/$net/ && s{(10.8.100.5/32)}{$1, $net}g;
  push @result, $_;
}
close ($input);

open (my $output, '>', $file) or die $!;
print $output @result;
close ($output);

Да, для маленьких файлов это мелочь, но мне, как плюсовику, режет глаз :)

Для реально больших файлов можно не складывать строки в массив, а записывать их в выходной файл сразу (файл должен быть с новым именем, а потом заметь старый через rename). Это сэкономит память, но может усложнить код, так что без надобности можно этого не делать (но однострочник внутри работает именно так).

Исходная версия annulen, :

В этом коде есть одна операция с потенциально квадратичной сложностью, которую можно очень легко избежать

use strict;

my @result;

my $file = $ARGV[0];
$file && -f $file or die $!;

open (my $input, '<', $file) or die $!;

my $net = '192.168.0.0/24';
while (<$input>) {
  ! m/$net/ && s{(10.8.100.5/32)}{$1, $net}g;
  push @result, $_;
}
close ($input);

open (my $output, '>', $file) or die $!;
print $output @result;
close ($output);

Да, для маленьких файлов это мелочь, но мне, как плюсовику, режет глаз :)

Для реально больших файлов можно не складывать строки в массив, а записывать их в выходной файл сразу (файл должен быть с новым именем, а потом заметь старый через rename). Это усложнит код, так что без надобности делать так не надо (но однострочник внутри работает именно так).