LINUX.ORG.RU

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

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

А что сложного?

my %changes = {
  'param1' => 'value1',
  'param2' => 'value2',
};

my %config;

# считываем и парсим конфиг
my $CONFFILE;
open $CONFFILE, "$conf_file_name";
while ( my $line = <$CONFFILE> ) {
  if ( $line =~ m/^\s*(\S+)\s*=\s*(\S+)\s*$/ ) {
     my $param = $1; my $value = $2;
     $config{$param} = $value;
  };
};
close $CONFFILE;

# применяем %changes
for my $param ( keys %changes ){
  $config{$param} = $changes{$param};
};

# записываем результат
open $CONFFILE, ">$conf_file_name";
for my $param (sort keys %config) {
   PRINTF $CONFFILE "%s = %s\n", $param, $config{$param}
};
close $CONFFILE;

Или даже так

my @config;

my $CONFFILE;
open $CONFFILE, "$conf_file_name";
while ( my $line = <$CONFFILE> ) {
   chomp $line;
   for my $param ( keys %changes ) {
      # если нашли подходящую строку - правим её.
      if ( $line =~ m/^\s*${param}\s*=/ ) {
         my $line = sprintf "%s = %s\n", $param, $changes{$param};
         delete $changes{$param};
      };
      push @config, $line;
   };
};
close $CONFFILE;
# если подходящую строку не нашли, дописываем новый параметр в конец
for my $param ( keys %changes ) {
   push @config, sprintf( "%s = %s\n", $param, $changes{$param});
};

# ну и потом записываем @config в файл

З.Ы. код писал прямо в окне добавления комментария, не отлаживал

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

А что сложного?

my %changes = {
  'param1' => 'value1',
  'param2' => 'value2',
};

my %config;

# считываем и парсим конфиг
my $CONFFILE;
open $CONFFILE, "$conf_file_name";
while ( my $line = <$CONFFILE> ) {
  if ( $line =~ m/^\s*(\S+)\s*=\s*(\S+)\s*$/ ) {
     my $param = $1; my $value = $2;
     $config{$param} = $value;
  };
};
close $CONFFILE;

# применяем %changes
for my $param ( keys %changes ){
  $config{$param} = $changes{$param};
};

# записываем результат
open $CONFFILE, ">$conf_file_name";
for my $param (sort keys %config) {
   PRINTF $CONFFILE "%s = %s\n", $param, $config{$param}
};
close $CONFFILE;

Или даже так

my @config;

my $CONFFILE;
open $CONFFILE, "$conf_file_name";
while ( my $line = <$CONFFILE> ) {
   chomp $line;
   for my $param ( keys %changes ) {
      # если нашли подходящую строку - правим её.
      if ( $line =~ m/^\s*${param}\s*=/ ) {
         my $line = sprintf "%s = %s\n", $param, $changes{$param};
         delete $changes{$param};
      };
      push @config, $line;
   };
};
close $CONFFILE;
# если подходящую строку не нашли, дописываем новый параметр в конец
for my $param ( keys %changes ) {
   push @config, sprintf( "%s = %s\n", $param, $changes{$param});
};

# ну и потом записываем @config в файл

З.Ы. код писал прямо в окне добавления комментария, не отлаживал