Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск в файле и запись в файл, поиск в файле переменной и запись ... 
:(
    Опции темы
geta1swa
Дата 6.8.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 22.7.2008
Где: Dnepropetrovsk

Репутация: нет
Всего: нет



Добрый вечер!

Плдскажите плиз есть файл такого содержания:

10.20.159.77  Wed Aug 6 22:02:15 2008 
10.20.159.100  Wed Aug 6 22:02:15 2008
10.20.159.111   Wed Aug 6 22:02:15 2008 

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

 
#!/usr/bin/perl 

my  $time=localtime (time);  

my @host=('10.20.159.77','10.20.159.100','10.20.159.111','192.33.33.11');
foreach my $ip (@host) {

open (C, "</ip/ip-time.dat") or die print "Can't open file ip-time.dat\n" ;
          while (<C>) {
         my ($ip2, $time1, $time2, $time3, $time4, $time5) = split /\s+/;       
             if ($ip eq $ip2) {                                                                                   
                 print "$ip2  down! $time1 $time2 $time3 $time4 $time5 \n"; }
              else { next; } 
              open ( C, ">>/ip/ip-time.dat") or die print "Can't open file ip-time.dat\n" ;
              print C "$ip  $time\n";
                } }
             close ©;


не работает:

open ( C, ">>/ip/ip-time.dat") or die print "Can't open file ip-time.dat\n" ;
              print C "$ip  $time\n";

не пишет в файл, результат в файле должен быть такой:

10.20.159.77  Wed Aug 6 22:17:33 2008 
10.20.159.100  Wed Aug 6 22:17:33 2008 
10.20.159.111  Wed Aug 6 22:17:33 2008 
192.33.33.11  Wed Aug 6 22:17:33 2008 
  


PM MAIL ICQ   Вверх
nitr
Дата 6.8.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Обычно
1) или читаем и записываем в новый файл, потом переименовываем - минус время
2) или все изменения храняться "в переменной", затем обновляем файл - минус расход памяти
3) tie - минус ... не запутаться с ним ;) , память тоже но не значительно...

как пример:
Код
#!/usr/bin/perl
use strict;
use warnings;

use Tie::File;

my $filename = '/ip/ip-time.dat';
my $time = localtime(time);  
my @host = ('10.20.159.77', '10.20.159.100', '10.20.159.111', '192.33.33.11');

tie my @file_aka_array, 'Tie::File', $filename or die "Can't open $filename\n";

grep { push @file_aka_array, "$_ $time" } grep { "@file_aka_array" !~ /$_/ } @host;


P.S.: на ночь глядя grep'ую  smile 


--------------------
PM   Вверх
geta1swa
Дата 7.8.2008, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 22.7.2008
Где: Dnepropetrovsk

Репутация: нет
Всего: нет



вот примерно то что нужно,  пункт 2) но хотелось бы уйти то массива!

#!/usr/bin/perl

use Fcntl;
my  $time=localtime (time);
my @a;
my $k=0;
my @host=('10.20.159.77','10.20.159.100','10.20.159.101','192.33.33.11','10.20.12.16');
foreach my $ip (@host) {
sysopen (C, "/ip/ip-time.dat", O_RDWR  ) or die print "Can't open file ip-time.dat\n" ;
     while (<C>) {
    
     my ($ip2, $time1, $time2, $time3, $time4, $time5) = split /\s+/;

     push  (@a, $ip2, $time1, $time2, $time3, $time4, $time5 ); }

     if ($ip eq $a[$k]) {  print "$a[$k] $a[$k+1] $a[$k+2] $a[$k+3] $a[$k+4] $a[$k+5]\n";  }
     else { 
             print C "$ip $time\n";
             print  "$ip $time\n"}
     $k=$k+6;  }


 close ©;
PM MAIL ICQ   Вверх
nitr
Дата 7.8.2008, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



geta1swa, чем вам 3-ий не подходит? smile (он не расходует память в огромных количествах, почитайте документацию про Tie::File).
Если вы хотите использовать №2, то как уйдёте от массива smile ?

И на сколько вижу, ваш пример практически не отличается от первого примера smile Появились имхо лишние переменные.
№2, считываем ip-time.dat в массив, закрываем дескриптор на файл, затем сверяем его с вашим @host, вносим в массив изменения, после массив записываем в файл ip-time.dat. А чтение-запись, тут могут возникнуть сложности/ошибки...


--------------------
PM   Вверх
geta1swa
Дата 9.8.2008, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 22.7.2008
Где: Dnepropetrovsk

Репутация: нет
Всего: нет



nitr, может ВЫ меня не правильно поняли,суть такая есть переменная которая лежит в @host  нужно:
1. отрыть файл пролистать его
2. если есть совпадение взять ее значение йз файла и вывести
3. если нет записать в файл и вывести 
4. и ето только в том случае если не прошел ping
5. каждому хосту назначено описание:
          
Код

                print "$ip  down! $time  $discription[$k]\n";

порядок вывода тоже необходимо не нарушить

Это сообщение отредактировал(а) geta1swa - 9.8.2008, 13:11
PM MAIL ICQ   Вверх
nitr
Дата 9.8.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



geta1swa, а ВЫ меня не поняли smile Я не видел ТЗ, и смотреть на него не буду smile , я смотрел на ваш ПЕРВЫЙ КОД, и основывался именно им smile, написал код для ознакомления с Tie::File. Неболее и неменее.

Где вы заметили, что у меня иначе, очень даже похоже на ваш код (пинга и в нём нет)?
Код
#!/usr/bin/perl
use strict;
use warnings;

use Tie::File;

my $filename = '/ip/ip-time.dat';
my $time = localtime(time);  
my @host = ('10.20.159.77', '10.20.159.100', '10.20.159.111', '192.33.33.11'); #наш @host

tie my @file_aka_array, 'Tie::File', $filename or die "Can't open $filename\n"; #применяем Tie::File для работы с файлом как с массивом

grep { push @file_aka_array, "$_ $time" } grep { "@file_aka_array" !~ /$_/ } @host;
=comment
grep { "@file_aka_array" !~ /$_/ } @host;
выбираем в массив те IP, которых нет в нашем файле

grep { push @file_aka_array, "$_ $time" }
записываем те IP, которые выбрали выше, т.е. те которых нет

эта строка аналогична вот этим ниже:
my @arr;
foreach (@host) {
    # здесь можете свой ping вставить :)
    # можно вывести те, которые есть
    push @arr, $_ if "@file_aka_array" !~ /$_/;
}
foreach (@arr) {
    # здесь можете свой пинг вставить :)
    # и print :)
    push @file_aka_array, "$_ $time";
}
=cut


Добавлено через 23 секунды
P.S.: писал прям в форум...


--------------------
PM   Вверх
geta1swa
Дата 11.8.2008, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 22.7.2008
Где: Dnepropetrovsk

Репутация: нет
Всего: нет



Спосибо за помощь nitr,
 
Код

tie my @file_aka_array, 'Tie::File', $filename or die "Can't open $filename\n";
  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0746 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.