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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск строк в файле и хэши 
:(
    Опции темы
study
Дата 3.5.2006, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет всем!
Народ у меня такой вопрос. Мне надо проанализировать файл, при обнаружении определенный строки (например start-111), начинать подсчет других определенных строк, а при обнаружении строки stop-111, завершать сбор и выводить накопленную статистику в файл. Возможна ситуация, когда до завершения сбора придет другой start-222...

Можно ли сохранять в хэшь или в массив (многомерный) эти данные, а по приходу stop удалять этот параметр из хэша, т.е. (a, @b), где a - парамертstart, а массив b - строки? 
PM MAIL   Вверх
GoodBoy
Дата 3.5.2006, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



study, что-то такое тебе надо?

Код
if (open (FL, "data.dat")) {
    my %hash = ();
    while (<FL>) {
        if ($_ =~ /start-(\d+)/) {  # попалась строка вида "start-цифры"
            @{$hash{$1}} = ();   # объявить массив в хэше
        } elsif ($_ =~ /stop-(\d+)/) {  # попалась строка вида "stop-цифры"
            my $num = $1;

            # сделать что надо с массивом  @{$hash{$num}}

            delete $hash{$num};  # удалить обработанный массив из хэша
        } else {
            my $str = $_;
            # сделать что надо со строкой $str

            push(@{$hash{$num}}, $str);
        }
    }
} else {
    print "Не могу открыть файл - $!";
}
 


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
study
Дата 3.5.2006, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо GoodBoy, сейчас попробую 
PM MAIL   Вверх
study
Дата 4.5.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет ещё раз!

Народ, а нельзя ли это как-нибудь оптимизировать, может не через хеши делать, а то слишком долго считает?  smile  
PM MAIL   Вверх
GoodBoy
Дата 4.5.2006, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



оптимизировать можно вот так:

Код
open (FL, "data.dat") || die "Не могу открыть файл - $!";
my @lines = <FL>;
close FL;
my %hash = ();
while my $line (@lines) {
    if ($line =~ /start-(\d+)/) {  # попалась строка вида "start-цифры"
        @{$hash{$1}} = ();   # объявить массив в хэше
    } elsif ($line =~ /stop-(\d+)/) {  # попалась строка вида "stop-цифры"
        my $num = $1;

        # сделать что надо с массивом  @{$hash{$num}}

        delete $hash{$num};  # удалить обработанный массив из хэша
    } else {
        # сделать что надо со строкой $line

        push(@{$hash{$num}}, $line);
    }
}
 


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
sharq
Дата 4.5.2006, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



GoodBoy, зачем ты читаешь в массив, а потом его перебераешь, это лишнее, много памяти тратится, особенно если файл большой.
Плюс отказываемся от старого стиля работы с файлами, а именно - от глобов и отказаться от лишних переменных - например, $line заменить на $_.
Поэтому:
Код

my %hash;
open (my $fl, '<', 'data.dat') || die "Не могу открыть файл - $!";
while (<$fl>) {
    chomp;
    ...
}


Плюс можно переписать через ссылки, чтобы все было оптимально.
А на счет алгоритма - я не смотрел smile

 smile     

Это сообщение отредактировал(а) sharq - 4.5.2006, 13:14


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
nitr
Дата 4.5.2006, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Для работы с большими файликами лучше использовать tie

Добавлено @ 11:26 
На крайняк как DB_FILE... здесь уже писалось об этом...

Добавлено @ 11:30 
смотри тут
и тут 


--------------------
PM   Вверх
GoodBoy
Дата 4.5.2006, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



sharq, уважаемый, ты взял скелет из моего сообщения (второго от начала этой темы). Для чего это было сделано, можешь мне пояснить? 


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
sharq
Дата 4.5.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



GoodBoy
я оптимизировал приведенный тобой код, т.к.
Цитата(study @  4.5.2006,  10:47 Найти цитируемый пост)
нельзя ли это как-нибудь оптимизировать

А логику работы я не оптимизировал, т.к. не разбирал и твой вариант вполне рабочий!

Или тебе не понравилась моя оптимизация?  smile


 smile 
  

Это сообщение отредактировал(а) sharq - 4.5.2006, 12:55


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Kannabismus
Дата 4.5.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Тим Тоуди



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

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



Цитата(sharq @ 4.5.2006,  11:23)
Плюс отказываемся от старого стиля работы с файлами, а именно - от глобов...

Аргументируй, пожалуйста 
PM   Вверх
sharq
Дата 4.5.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



Kannabismus, в книле Ларри Уолла есть маленькая пометка об этом.
А вот в книге Intermediate Perl (вышла совсем недавно - март 2006, авторы:  brian d foy, Tom Phoenix, Randal L. Schwartz) отлично написано.

Ну а если нет под рукой книг, то вот:
в версии perl 5.6 появилась возможность в качестве файлового дескриптора использовать обыкновенный скалярную переменную,
незаводя для этого глоб, который может быть уже занят. Переменная определяется в open и что самое полезное - можно не закрывать файл (если нет необходимости!), то сборщик мусора perl сам все сделает. Так, например, в данном примере, close $fh - излишне!

Всем советую полистать приведенные выше книги, т.к. они действительно полезны, но не заменяют perldoc, а дополняют.
Плюс книга Perl Best Practics Damian Conway.

 smile  


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
GoodBoy
Дата 4.5.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



Цитата(sharq @  4.5.2006,  13:53 Найти цитируемый пост)
Или тебе не понравилась моя оптимизация?

Ты "оптимизировал" мой код вернув его к первоначальному варианту!!! 


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
sharq
Дата 4.5.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



GoodBoy, т.к. первоначальный вариант, твой лучше, чем второй.
Но мой вариант все-таки отличается от первого твоего + я посоветовал использовать ссылки (например, вместо %).

 smile  


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
GoodBoy
Дата 4.5.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

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



Цитата(sharq @  4.5.2006,  16:01 Найти цитируемый пост)
я посоветовал использовать ссылки 

Что ты этим хочешь сказать?

Что вместо
Код
my %hash = ();

использовать
Код
my $hash = {};

??

и, типа,
Код
@{$hash{$1}}

будет чем-то отличаться от
Код
@{$hash->{$1}}

??

Или что? 


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Kannabismus
Дата 5.5.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Тим Тоуди



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

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



Цитата
Kannabismus, в книле Ларри Уолла есть маленькая пометка об этом.

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


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

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


 




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


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

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