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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как удалить первую строку в файле? 
:(
    Опции темы
Guest
Дата 21.11.2005, 13:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Добавил еще переменную (она же флаг). Теперь можно не только добавить строчку, но и удалить и модифицировать любую строкуsmile
Интересно, а можно сделатьтак чтобы одномоментно выполнялась только одна копия процесса?
Может ли сервак поставить запрос к скрипту в очередь?

Код

#!/usr/bin/perl
use strict;

my $pair;
my $name;
                  # 1 new record - (фиксированные значения для отладки)
my $bufer="q=%39%37%62%38%65%64%35%33&d=%30%30%30%30%30%30%30%30";
                  # 2 modify
#my $bufer="q=%39%37%62%38%65%64%35%33&d=%29%27%22%28%25%24%25%23";
                  # 3 delete
#my $bufer="q=%30%30%30%30%30%30%30%30&d=%29%27%22%28%25%24%25%23";

my $value;
my @pairs = split(/&/, $bufer);
my $step=0;
my @params;
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
   $params[$step] = $value;
   $step++;
 print "name: $name value: $value  step: $step", "\n";
}
   my $zero=pack("H8","00000000");

my $bin_a=pack("H8",$params[0]);
my $bin_b=pack("H8",$params[1]);
 $value=unpack("H8",$bin_a);  print "bin_a= $value", "\n";
 $value=unpack("H8",$bin_b);  print "bin_b= $value", "\n";


my $LIMIT=10;
my $datalengh=4;
my (@buf, $buff);
my $file="test.bin";
my $flag = 0;


if (!-e $file) {  
    open FH, ">$file";
    binmode FH;
    print FH $bin_a;     
    close (FH);
    exit(0); 
}

 open FH, "$file";    
 flock (FH, 1);
 binmode FH;   
 seek(FH, 0, 0);

 while (read(FH,$buff,$datalengh)) {
 if (($bin_a eq $zero) && ($bin_b ne $zero)) {       #delete
 if ($buff ne $bin_b)  { push (@buf,$buff); }
     next;  }
 if (($bin_a ne $zero) && ($bin_b ne $zero)) {       #modify
 if ($buff eq $bin_a)   { $buff=$bin_b; }   
    push (@buf,$buff); next;  }
 if (($bin_a ne $zero) && ($bin_b eq $zero)) {       #add record
    if ($buff eq $bin_a) { $flag = 1;  last; }
    push (@buf,$buff);   } 
}
 flock (FH, 0);
 close FH;

unless ( $flag ) {
shift @buf if @buf >= $LIMIT;
 if (($bin_a ne $zero) && ($bin_b eq $zero)) { push(@buf, $bin_a); }
 open FH, ">$file"; 
 flock (FH, 2); binmode FH;   
 seek(FH,0,0);
 print FH for @buf;
 flock (FH, 0);  close FH;
}



  Вверх
korob2001
Дата 21.11.2005, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Создай блокировку на другой файл, пусть на нём и создаётся очередь. Например:
Код

#!/usr/bin/perl
use strict;
use Fcntl qw( :flock );

# блокируем код, вся очередь будет стоять здесь
start_lock();

# Вместо следующих трёх строк твой код, к которому будет создаваться очередь
print "Please enter your name: ";
chomp( my $name = <STDIN> );
print "Hello $name\n";

# Закрываем блокировку и завершаем выполнение программы
stop_lock();
exit 0;

sub start_lock {
       open( BLOCK, "> semaphor.sem" ) or die "Can't open block file: $!\n";
       flock( BLOCK, LOCK_EX ) or die "Can't locked file: $!\n";
}

sub stop_lock {
       close(BLOCK);
}

Теперь сохрани всё это дело и попробуй запустить из командной строки. Запусти второй сеанс командной строки и запусти тот же файл. После в одном ты видишь запрос на ввод имени, во втором ничего, так как ожидает в очереди. Теперь в первом введи своё имя и нажми enter, в первом ты увидешь приветствие, а во втором появится запрос на вод имени, так как подошла его очередь. Получается мы блокируем часть кода. Всё что находится между вызовами подпрограмм start_lock() и stop_lock() будет забокированно. Очередь создаётся в том месте, где была вызвана подпрограмма start_lock().

Это сообщение отредактировал(а) korob2001 - 22.11.2005, 10:19


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Гость_Kris
Дата 22.11.2005, 14:28 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А зачем здесь использовать модуль Fcntl?
Вот такой код тоже вроде нормально работает smile

Код

#!/usr/bin/perl
use strict;

my $tempfile="semaphor.sem";
# блокируем код, вся очередь будет стоять здесь
start_lock();

# Вместо следующих трёх строк твой код, к которому будет создаваться очередь
print "Please enter your name: ";
chomp( my $name = <STDIN> );
print "Hello $name\n";

# Закрываем блокировку и завершаем выполнение программы
stop_lock();
exit 0;

sub start_lock {
       open( BLOCK, "> $tempfile" ) or die "Can't open block file: $!\n";
       flock( BLOCK, 2 ) or die "Can't locked file: $!\n";
}

sub stop_lock {
       unlink $tempfile;
       close(BLOCK);
}




  Вверх
korob2001
Дата 22.11.2005, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Ну это уже дело вкуса, лично я пользуюсь всегда Fcntl, тем более он входит в стандартыный пакет. Смысл был не в Fcntl, а в том как создать очередь с помощью блокировки.

Это сообщение отредактировал(а) korob2001 - 22.11.2005, 15:05


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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