Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > нужно написать 2 программки на perl


Автор: scion 10.6.2009, 16:44
Прошу помочь(кто чем может) с реализацией:

1.       Реализовать набор функций для работы с временными файлами. Первая функция должна создавать
временный файл и сохранять его имя в указанной переменной, вторая удалять его. Временные файлы
должны удаляться даже если выполнение скрипта завершено принудительно или в результате ошибки.
Если файл был создан, но не удален, то в конце работы скрипта должно выводится предупреждение

 
2.       Реализовать функцию, которая проверяет, что все переменные из списка переданных ей установлены.
Количество параметров не фиксированное.

пример вызова:
SOME_VARIABLE=Test
CheckVariables SOME_VARIABLE SOME_OTHER_VARIABLE

Вывод:
SOME_OTHER_VARIABLE not assigned

Автор: ginnie 10.6.2009, 16:53
scion, рекомендую следующий алгоритм:

1. Подумать и описать словами действия, которые будет выполнять программа
2. Заменить словестные описания блоками кода на Perl
3. Проверить работоспособность кода (на тестовых примерах)
4. Если что-то сделать не получается, задать в форуме конкретный вопрос.

Автор: sir_nuf_nuf 10.6.2009, 16:54
1) Все уже сделано, до нас:
http://search.cpan.org/~tjenness/File-Temp-0.21/Temp.pm
2) А вы знаете что такое perl ?
есть встроенная функция - defined
Код

my $a = "3"
print defined $a ? "OK" : "Not defined";

Автор: ginnie 10.6.2009, 16:57
sir_nuf_nuf, по второй задаче, мне кажется, что надо определить "установлены ли указанные переменные окружения".

Автор: sir_nuf_nuf 10.6.2009, 17:00
Цитата(ginnie @  10.6.2009,  16:57 Найти цитируемый пост)
sir_nuf_nuf, по второй задаче, мне кажется, что надо определить "установлены ли указанные переменные окружения".

ооо.. это в корне меняет дело. По этой теме уже можно писать научную работу =)

Автор: KSURi 10.6.2009, 18:27
 smile 
The Feynman Problem-Solving Algorithm:
  • write down the problem;
  • think very hard;
  • write down the answer.

Автор: ginnie 10.6.2009, 18:35
KSURi, ты пропустил важные детали:

Автор: записывает проблему
Посетители форума: старательно обдумывают варианты решения
KSURi: пишет решение (раньше всех и получает разные бонусы)  smile 

Автор: scion 12.6.2009, 00:38
Цитата(sir_nuf_nuf @ 10.6.2009,  16:54)
1) Все уже сделано, до нас:
http://search.cpan.org/~tjenness/File-Temp-0.21/Temp.pm
2) А вы знаете что такое perl ?
есть встроенная функция - defined
Код

my $a = "3"
print defined $a ? "OK" : "Not defined";

за темп спс.
то что нужно. 

Автор: scion 12.6.2009, 03:24
#!/usr/bin/perl
#Create temp file;
use File::Temp qw/ :POSIX /;
  $file = tmpnam();
  $fh = tmpfile();
($fh, $file) = tmpnam();

 while (1) {};
END { unlink($file) or die  "Couldn't unlink $file : $!"}

почему временный файл не хочет удалятся? Нет я понимаю что я не дохожу до последней инструкции, а как мне сделать что бы она в любом случаи исполнялась)
когда я прерываю выполнения программы (то есть завершаю её аварийно).... (на цыкле)

Автор: KSURi 12.6.2009, 12:16
Установите обработчик для SIGINT (^C)

Автор: scion 12.6.2009, 12:48
Цитата(KSURi @ 12.6.2009,  12:16)
Установите обработчик для SIGINT (^C)

но это не правильно. а если программа умрёт по каким-то другим причинам?

Автор: amg 12.6.2009, 14:46
Цитата(scion @ 12.6.2009,  12:48)
Цитата(KSURi @ 12.6.2009,  12:16)
Установите обработчик для SIGINT (^C)

но это не правильно. а если программа умрёт по каким-то другим причинам?

Да, действительно, а если по компьютеру ударят кувалдой smile  
Впрочем, если хорошенько прицелиться, то файл можно и удалить.

Автор: scion 12.6.2009, 17:54
что-то я окончательно потерялся... ;(

Автор: scion 12.6.2009, 19:39
если так:

$SIG{INT} = \&sig_handler; 
print "Работаю в поте лица...\n" while (1);

sub sig_handler { 
   $SIG{INT} = \&sig_handler; 
   print "Получен сигнал INT по нажатию Ctrl+C\n"; 
   print "Заканчиваю работу!\n"; 
   exit; # завершение выполнения программы
}

сигнал от ^С обрабатывается, а от kill ID нет... =(
пробовал ловить SIG{HUP}

Автор: KSURi 13.6.2009, 00:25
так kill вроде по умолчанию посылает SIGKILL, не? и кстати, обработчик достаточно поставить один раз

Добавлено через 3 минуты и 53 секунды
Цитата(scion @  12.6.2009,  03:24 Найти цитируемый пост)
когда я прерываю выполнения программы (то есть завершаю её аварийно)

Я подумал, что вы сами ее насильно завершаете. Обычно это как раз делают черезе ^C или ^BREAK.
Если вам нужно более универсальное решение, то пишите отдельный скрипт, который по каким-то параметрам будет мониторить сабж и делать всякие штуки после его смерти

Автор: scion 13.6.2009, 00:51
Цитата(KSURi @ 13.6.2009,  00:25)
так kill вроде по умолчанию посылает SIGKILL, не? и кстати, обработчик достаточно поставить один раз

Добавлено @ 00:29
Цитата(scion @  12.6.2009,  03:24 Найти цитируемый пост)
когда я прерываю выполнения программы (то есть завершаю её аварийно)

Я подумал, что вы сами ее насильно завершаете. Обычно это как раз делают черезе ^C или ^BREAK.
Если вам нужно более универсальное решение, то пишите отдельный скрипт, который по каким-то параметрам будет мониторить сабж и делать всякие штуки после его смерти

ок. т.е. в perle такого не реализовано? просто я думал что в перле есть уже нечто такое что бы мониторить...

"кстати, обработчик достаточно поставить один раз" можно подробнее... что вы имели в виду?

хочу ловить $SIG{INT}  и $SIG{KILL} 
нужно писать 

$SIG{INT} = \&sig_handler; 
$SIG{KILL} = \&sig_handler2; 

и соотв. что делают это функции. я правильно понял?

можно ли как-нибудь сделать одну универсальную функцию для сигналов INT и KILL?

Автор: shamber 13.6.2009, 02:16
Цитата(scion @  13.6.2009,  00:51 Найти цитируемый пост)
и соотв. что делают это функции. я правильно понял?

да

$SIG{INT} = \&my_Super_Function; 
$SIG{KILL} = \&my_Super_Function;

Будет Вам универсальная функция smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)