Как записать в текстовый файл, заменив строку на строку perl скрипт? - PullRequest
0 голосов
/ 30 апреля 2020

у меня есть два файла. один из них - входной файл пользователя, а другой - оригинальный файл конфигурации. После сравнения двух файлов добавьте / удалите функции в моем исходном файле конфигурации.

пользовательский входной файл: (показывается строка за строкой)

 add:L28A:Z:W   #add--> DID ID --> Bin ID 
 del:L28C:B:Q:X:

оригинальный входной файл

L28A:B:Q:M:X:
L28C:B:Q:M:X:
L38A:B:Q:M:X:

в зависимости от входного файла пользователя: сначала выполняется функция добавления, затем - функция удаления, а третья - функция замены. поэтому вывод для исходного входного текстового файла должен показывать:

L28A:B:Q:M:X:Z:W
L28C:M:
L38A:B:Q:M:X:

, но мой код показывает:

L28A:B:Q:M:X:Z:W
L28C:M:

как я могу отобразить остальную часть исходной строки конфигурации?

use strict;
use warnings;
use File::Copy;
use vars qw($requestfile $requestcnt $configfile $config2cnt $my3file $myfile3cnt $new_file $new_filecnt @output);

  my $requestfile = "DID1.txt"; #user's input file
  my $configfile = "DID.txt";   #original config file
  my $new_file = "newDID.txt";
  readFileinString($requestfile, \$requestcnt);
  readFileinString($configfile, \$config2cnt);
  copy($configfile, $new_file) or die "The copy operation failed: $!";
  open(DES,'>',$configfile) or die $!;
   while ($requestcnt =~ m/^((\w){3})\:([^\n]+)$/mig) #Each line from user request
   {
   my $action = $1;
   my $requestFullLine = $3;
   while ($requestFullLine =~ m/^((\w){4})\:([^\n]+)$/mig) #Each line from user request
   {
    my $DID = $1; #DID
    my $requestBinList = $3; #Bin List in user request
     if ($config2cnt =~ m/^$DID\:([^\n]+)$/m) #configfile
     {
     my $ConfigFullLine = $1;  #Bin list in config
     my $testfile = $1;
     my @First_values = split /\:/, $ConfigFullLine;
     my @second_values = split /\:/, $requestBinList;
     foreach my $sngletter(@second_values) # Each line from user request
     {
  if( grep {$_ eq "$sngletter"} @First_values)
     {
    print " $DID - $sngletter - Existing bin..\n\n";
     }
  else
    {
    print "$DID - $sngletter - Not existing bin..\n\n";
   }
   }

   print "Choose option 1.Yes  2.No\n";
   my $option = <STDIN>;
   if ($option == 1) {
   if($action eq 'add')
   {
    $ConfigFullLine =~ s/$/$requestBinList/g;
    my $add = "$DID:$ConfigFullLine";
    print DES "$add\n" ;
    print"New Added Bin Valu $add\n\n";
   }

   if ( $action eq 'del')
   {
   foreach my $sngletter(@second_values){
   $ConfigFullLine =~ s/$sngletter://g;
   }
   print DES "$DID:$ConfigFullLine\n";
   print "New Deleted Bin Value $DID:$ConfigFullLine\n\n";
   }

 if ( $action eq 'rpl')
   {
    my $ConfigFullLine = $requestBinList;
    my $replace = "$DID:$ConfigFullLine";
    print DES "$replace\n";
    print"Replace Bin Value $replace\n\n";
    }
    }
 elsif ($option == 2)
   {
   print"Start from begining\n";
   }
 else
  {
    print "user chose invalid process or input is wrong\n";
    }
  }
else
 {
   print "New DID $DID detected\n";}
 }
}
 sub readFileinString
 {
 my $File = shift;
 my $string = shift;
use File::Basename;
 my $filenames = basename($File);
open(FILE1, "<$File") or die "\nFailed Reading File: [$File]\n\tReason: $!";
read(FILE1, $$string, -s $File, 0);
close(FILE1);
}
...