LINUX.ORG.RU

Помогите плиз исправить ошибки в скрипте.

 


0

1
#!/usr/bin/perl
use strict;
use LWP::UserAgent;

 open (FILE1,"file1.txt");
 my @lines1 = <FILE1>;
 $new_ip = $lines1[0]; #Считываем IP из файла
  $new_ip =~ s/^\s+|\s+$//g; #trim
close(FILE1);

   #Добавлено:
  open (FILE,"my_ip.txt");
  my @lines = <FILE>;
  $old_ip = $lines[0]; #Считываем IP из файла
  $old_ip =~ s/^\s+|\s+$//g; #trim
  close(FILE);
  if ($old_ip eq $new_ip) {
    die "IP not changed"; # Выходим из скрипта, если IP не изменился
  }
  open (FILE,">my_ip.txt");
  print FILE $new_ip; # Записываем в файл новый IP
  close(FILE);

Я понимаю что что-то тут накручено не верно, но процесс должен идти так:

Есть файл со старым ИП адресом и файл с новым ИП. Новый сравнивается со старым и если разница есть, то новый записывается. Если же нет, то закрывается.

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


use Tie::File;

tie my @new_ip, 'Tie::File', 'file1.txt' or die $!;
tie my @old_ip, 'Tie::File', 'my_ip.txt' or die $!;

s/^\s+|\s+$//g for $new_ip[0], $old_ip[0]; # trim

$old_ip[0] = $new_ip[0] if $old_ip[0] ne $new_ip[0];

untie @new_ip;
untie @old_ip;
Deleted
()
Ответ на: комментарий от Deleted

ОК спасибо, подскажите что надо дописать к Вашему коду если после определения IP идет строчка

system('systemctl stop ddclient');
и мне необходимо не выполнять эту команду если IP не изменился(т.е. завершить скрипт) и соответственно выполнить если файл перезаписался по новой.

Tavols
() автор топика

use strict;


 open (FILE1,"file1.txt");
 my $new_ip = <FILE1>;
  chomp $new_ip;
  $new_ip =~ s/^\s+|\s+$//g; #trim
close(FILE1);

  #Добавлено:
  open (FILE,"my_ip.txt");
  my $old_ip = <FILE>;
  chomp $old_ip;
  $old_ip =~ s/^\s+|\s+$//g; #trim
  close(FILE);
  if ($old_ip eq $new_ip) {
    die "IP not changed"; # Выходим из скрипта, если IP не изменился
  }
anonymous
()

Я понимаю что что-то тут накручено не верно

Ну так почитай ругань интерпретатора и исправь ошибки, они достаточно детально описывают происходящее. Задай скалярам $new_ip и $old_ip лексическую область видимости через my(), как это сделано для массивов @lines и @lines1.

Или вот такой вариант. Нет лишних модулей, всякого говна типа FILE1/FILE, есть защитное программирование.

my ($old_ip, $new_ip);
{
    my $read_ip_address_from = sub {
        my ($path) = @_;
        my $content = do {
            open my $fh, $path or die qq{can't open file "$path": $!};
            local $/;
            <$fh>;
        };
        my ($ip_address) = $content =~ m{(\d+\.\d+\.\d+\.\d+)}x;
        return $ip_address;
    };
    my $put_ip_address_to = sub {
        my ($path, $ip_address) = @_;
        open my $fh, '>', $path or die qq{can't open file "$path": $!};
        print {$fh} $ip_address;
    };

    $old_ip = $read_ip_address_from->('my_ip.txt');
    die 'old_ip is not defined' unless $old_ip;

    $new_ip = $read_ip_address_from->('file1.txt');
    die 'new_ip is not defined' unless $new_ip;

    die 'IP is not changed' if $new_ip eq $old_ip;

    $put_ip_address_to->('my_ip.txt', $new_ip);
}

outtaspace ★★★
()
Ответ на: комментарий от Tavols

мне необходимо не выполнять эту команду если IP не изменился

Слишком много отрицаний в одном предложении.

die 'IP is not changed' if $new_ip eq $old_ip;

# записываем в файл новый IP
{
    open my $fh, '>', 'my_ip.txt' or die qq{can't open file "my_ip.txt": $!};
    print {$fh} $new_ip;
}

# выполнить если файл перезаписался
system('systemctl stop ddclient');
outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Спасибо добрый человек, Вы очень помогли мне.

Tavols
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.