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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рекурсивное сканирование каталогов, создание класса 
:(
    Опции темы
ginnie
Дата 22.8.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый burakov, еще раз хочу обратить Ваше внимание на

Цитата

а как передать имя файла в sub delete внутри модуля???


Надо передать имя файла не внутри модуля (класса), а внутри объекта (экземпляра класса). Лучше это делать используя в качестве основы класса массив или хэш, тогда все данные, уникальные именно для этого объекта надо помещать в этом массиве (хеше).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
shamber
Дата 22.8.2008, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(burakov @  22.8.2008,  15:17 Найти цитируемый пост)
my $file = shift;    #вот тут непонятно! глобально $file объявлять ?


а зачем объявлять, лучше его в самом начале сохранить в хэш, а потом удалить, так надежнее

если в самом конце удалять то используйте DESTROY

пример показал ginnie
PS может так лучше?
Код

package FileList;
use strict;
use warnings;

sub new {
    my $class = shift;    
    my $home_dir = shift; 
    my $self; 
    my $file = rand(); 
    $self->{filename} = "$home_dir/$file\.tmp";
       

    if (-d $home_dir) {
        open ($self->{file}, "+>$self->{filename}") or die print ("Can't found file $self->{filename};"); 
        bless $self,$class;
        return $self; 
    }    
}

sub get_str {
    my $self = shift;
    my $str = <$self->{file}>; 
    chomp ($str) if ($str);
    return $str; 
}

sub put_str {
    my $self = shift;
    my $str = shift;
    print $self->{file} "$str\n" if ($str); 
    return $str;
}

sub DESTROY {
    my $self= shift;
    close ($self->{file});
    unlink ($self->{filename}) if (-e $self->{filename});
}

return 1;


Это сообщение отредактировал(а) shamber - 22.8.2008, 16:04
PM MAIL Jabber   Вверх
burakov
Дата 25.8.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день.
вообщем за выходные я разобрался в  ответах,примерах smile. огромное спасибо.

а вот на конструкцию my $str = <$self->{file}> PERL ругается.
Очевидно ему не нравится большое количество <->> вот таких вот значков
а как же тогда сказать ему чтобы он читал из файла?

Код

sub get_str {
    my $self = shift;
    my $str = <$self->{file}>;  #вот на вот это вот PERL ругается 
    chomp ($str) if ($str);
    return $str; 




--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
ginnie
Дата 25.8.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый burakov, попробуйте

Код

my $fh = $self->{file};
my $str = <$fh>;





--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
burakov
Дата 25.8.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо, 
я через так 

Код

my $fh = $self->{file};
my $str = <$fh>;
    
 попробовал - получилось, НО
а все таки без дополнительного присваивания
my $str = <$fh>;
 никак нельзя ?

ибо не всегда это вот присваивание уместно. я об него споткнулся, сейчас покажу

Код

sub new {
    my $self = {};
    $self->{class} = shift;
    $self->{file} = shift;
    $self->{fh} = my $fh;  
    
    if (-f $self->{file}){
        open ($self->{fh}, $self->{file});
        return bless $self;
    } 
}



вот например если делать open не на $self->{fh}, на $fh, 
то $self->{fh} остается закрытым дескриптором. Обо что я собственно и стукнулся .
поэтому ж и вопрос.

может както можно вывернуться и указать перлу чтобы он делал <> непосредственно из
$self->{file}??? 
или тут ничего не поделаешь? 
(по моему это вопрос чисто синтаксиса написания (не понимает <->>), поскольку логика перла в строке
open ($self->{fh}, $self->{file});
работает отлично)

Спасибо.




--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
ginnie
Дата 25.8.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый burakov, не могли бы Вы объяснить, как должен изменится $self->{fh} при вызове функции open() во фрагменте

Код

my $self = {};
$self->{fh} = my $fh;
open ($fh, 'some_file');


По теме: с <> по-другому нельзя (см. http://perldoc.perl.org/perlop.html, раздел I/O Operators), можно попробовать
Код

my $str = readline($self->{file});



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
burakov
Дата 27.8.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



добрый день

по поводу
Код

my $self = {};
$self->{fh} = my $fh;
open ($fh, 'some_file');


вот если вот так вот сделать, как в примере выше, а потом попытаться поработать с дескриптором, 
то получить строку из файла не удается 
типа get_str() ругается - ну я так понял на закрытый дискриптор или неопределенный дискриптор.

а вот если сделать вот так
Код

my $self = {};
$self->{fh} = my $fh;
open ($self->{fh}, 'some_file');


т.е. сделать open непосредственно на $self->{fh}
то все нормально.

УЖ не знаю с чем это связано...  
я так для себя по простому объяснил, что
типа просто $fh чем то отличается от open ($fh ......)
поэтому и спросил как убрать лишнее присваивание, чтобы лишний раз не путаться.

Огромное спасибо за ответы.



--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
ginnie
Дата 27.8.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый burakov,

Цитата

УЖ не знаю с чем это связано...


обязательно надо разобраться, если хотите заниматься разработкой на Perl.
Проблема с первым фрагментом в том, что сначала происходит присваивание, а затем вызов open(). В хэш попадает значение undef, а ссылка на файловый дескриптор после open() остается только в переменной $fh. Чтобы работало правильно надо присваивание делать после open().

Код

my $self = {};
my $fh;
open ($fh, 'some_file');
$self->{fh} = $fh;


стало понятнее?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
burakov
Дата 27.8.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да стало понятнее.....
присвоить 
$self->{fh} после open - как то до меня сразу не дошло.

---
я тему пока не закрываю,
еще поразбираюсь с классом который рекурсивно сканирует каталоги, спрошу чего нибудь
спасибо.


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
shamber
Дата 28.8.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



burakov, вопрос только в том, зачем вам плодить переменные. почему сразу не 
Код

open ($self->{fh}, 'some_file');

PM MAIL Jabber   Вверх
burakov
Дата 28.8.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



добрый день, 

все таки если не сделать

Код

$self->{fh} = my $fh;           #если не сделать вот этого...
open ($self->{fh}, 'some_file');


то без присвоения $self->{fh} переменной код не сработает

переменная $fh нужна впоследствии, для чтение строки из файла, посколько 
perl не понимает синтаксиса типа.

Код

sub get_str {
    my $self = shift;
    my $str = <$self->{file}>;  #вот на вот это вот PERL ругается 
    chomp ($str) if ($str);
    return $str; 



вот ginnie посоветовал воспользоваться функцией readline(), чтобы не плодить переменные.


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
burakov
Дата 3.9.2008, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день.
спрошу еще о сканировании каталогов.

захотелось создать кнопочку "СТОП", которая бы
делала DESTROY. на сканирование каталогов

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

тогда я подумал, что наверное если это вот сканирование выделить в отдельный процесс.
и потом делать Kill на вот этот вот отдельный процесс
(и хотя я работаю в windows Kill у меня тоже работает)
то это более четко прекратит сканирование каталогов.

только как сказать перлу, чтобы он запустил сканирование каталогов в отдельном процессе?
fork попробовал - получается вроде как два сканирования сразу - не подходит....

как правильно реализовать мою СТОП-идею?

Спасибо.





--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
shamber
Дата 3.9.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



почитайте про треды, на форуме может они вам помогут
PM MAIL Jabber   Вверх
burakov
Дата 3.9.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



форуме про это дело мало
нашел вот 
http://nopox.wordpress.com/2007/10/06/mult...eading-in-perl/
наворочено блин с тредами этими.

Ну а все таки, к черту потоки эти.
Дестрой то должен закрыть дескриптор - отчего ж тогда 
тогда ж так неустойчиво все отрабатывает???


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
shamber
Дата 3.9.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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

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


 




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


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

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