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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимизировать этот ужас. 
:(
    Опции темы
scion
Дата 15.6.2009, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



история такова, раньше немного писал на си. сейчас нужно на пеле написать задание.
Написать то я написал, но со стороны программиста на pel'е это наверное смотрится ужасно...
 нужно помочь сделать код который не стыдно будет показать. =) спасибо большое. всем.

Или может так нормально?


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

собственно то код:
#!/usr/bin/perl
$SIG{INT} = \&int_sig;
sub int_sig {
    $SIG{INT} = \&int_sig;
    print "Получен сигнал INT по нажатию Ctrl+C\n";
    print "Заканчиваю работу!\n";
    exit;
    }
# рождает tmp файлы
sub CrTempFile
{
    $num++;
    use File::Temp qw/ :POSIX /;
    my $file = tmpnam();
    my $fh = tmpfile();
    ($fh, $file) = tmpnam();
    print "created file: ", $file,"\n";
    $OpenFile[$num]=$file;
    return $file;
}

# удаляет темп файлы
sub DelTempFile
{
    foreach $_ (@_)
        {
        print "deleted: ",$_,"\n";
        unlink($_) or die  "Couldn't unlink $file : $!";
        $i=1;
######### вот это место точно надо рег. выражениями порешить... а то для перла это страшно...
        while ($i<=$num)
            {
                if ($OpenFile[$i] eq $_)
                            {

                                $OpenFile[$i]=0;
                            }
                $i++;
            }
        }
}

# тестируем создаём 5файлов. удаляем 3. остальные удаляются при ^C.
$file=CrTempFile();
$file2=CrTempFile();
$file3=CrTempFile();
$file4=CrTempFile();
$file5=CrTempFile();
DelTempFile($file);
DelTempFile($file2);
DelTempFile($file4);


 while (1) {print "Работаю ...\n"; sleep 1;};

END
{
    for ($i=1;$i<=$num;$i++){
        if ($OpenFile[$i] eq 0)
                {
                next;
                }
        print $OpenFile[$i],"\n";
    unlink($OpenFile[$i]) or die  "Couldn't unlink $file : $!";
#    print "OK";
    }
}

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


Опытный
**


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

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



Цитата(scion @  15.6.2009,  03:20 Найти цитируемый пост)
$SIG{INT} = \&int_sig;
sub int_sig {
    $SIG{INT} = \&int_sig;

Зачем вы два раза ставите один обработчик на один сигнал? Достаточно один раз это сделать в начале скрипта.
Цитата(scion @  15.6.2009,  03:20 Найти цитируемый пост)
    my $file = tmpnam();
    my $fh = tmpfile();
    ($fh, $file) = tmpnam();

И вот здесь непонятно зачем два раза...

Прогоните программу через perlcritic, он вам покажет самые грубые ошибки


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
scion
Дата 15.6.2009, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(KSURi @ 15.6.2009,  11:23)
Цитата(scion @  15.6.2009,  03:20 Найти цитируемый пост)
$SIG{INT} = \&int_sig;
sub int_sig {
    $SIG{INT} = \&int_sig;

Зачем вы два раза ставите один обработчик на один сигнал? Достаточно один раз это сделать в начале скрипта.
Цитата(scion @  15.6.2009,  03:20 Найти цитируемый пост)
   
 my $file = tmpnam();
    my $fh = tmpfile();
    ($fh, $file) = tmpnam();

И вот здесь непонятно зачем два раза...

Прогоните программу через perlcritic, он вам покажет самые грубые ошибки

спасибо.
один $SIG{INT} убрал.

это
 my $file = tmpnam();
    my $fh = tmpfile();
 ($fh, $file) = tmpnam()

заменил на просто my  ($fh, $file) = tmpnam();

вкуриваю в ман perlcritic...
PM MAIL   Вверх
amg
Дата 15.6.2009, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

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



Я бы заменил массив @OpenFile хэш %OpenFile. Тогда 
В sub CrTempFile $OpenFile{$file} = 1; (и счетчик не нужен)
В sub DelTempFile цикл while можно заменить на $OpenFile{$_} = 0; (и счетчик не нужен)
В блоке END достаточно будет что-то вроде unlink grep {$OpenFile{$_}} keys %OpenFile;
PM MAIL   Вверх
scion
Дата 15.6.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(amg @ 15.6.2009,  14:50)
Я бы заменил массив @OpenFile хэш %OpenFile. Тогда 
В sub CrTempFile $OpenFile{$file} = 1; (и счетчик не нужен)
В sub DelTempFile цикл while можно заменить на $OpenFile{$_} = 0; (и счетчик не нужен)
В блоке END достаточно будет что-то вроде unlink grep {$OpenFile{$_}} keys %OpenFile;

конструктивно. спасибо. сейчас займусь.
PM MAIL   Вверх
ramus
Дата 16.6.2009, 12:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(scion @  15.6.2009,  03:20 Найти цитируемый пост)
Временные файлы должны удаляться даже если выполнение скрипта завершено принудительно или в результате ошибки.

Не знаю как в винде, но на юниксе гарантированный способ - открыть файл и тут же, не закрывая его, удалить этот файл. Пока файл открыт в приложении он будет ему доступен. Никакой другой процесс доступ к Вашему временному файлу не сможет получить. Причем даже если другое, параллельно выполняемое приложение (попытка инъекции) попытается открыть/создать файл с точно таким же именем, то это будет другой файл (с другим i-node). Как только Ваше приложение закроет свой временный файл он автоматически удалится операционной системой и занимаемое им место вернется в файловую систему... 
Кстати:
- Секция END не отработается при kill -9
- Примененный механизм сигналов и обработчиков тоже имеет слабое место - Вы можете впоследствии переопределить в своей программе этот обработчик явно или неявно при использовании внешних модулей, например при работе c БД (DBD::Oracle).


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


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

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


 




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


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

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