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

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Некоторые операторы Perl, Неработает оператор 
:(
    Опции темы
shamber
Дата 1.10.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Uзверь, а не скромный вопрос можно? Это задачка откуда? smile
PM MAIL Jabber   Вверх
Uзверь
Дата 1.10.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот номер абонента 0 A9710189175023971 начиная с восьмерки
А вот это внутренний номер абонента (внутри организации)  5104 
И число с длительностью 03/12 13:06:52 00:00:18 
А что насчет пробелов то их число значения не имеет. лог приведен в своем натуральном виде.
Пока вот думаю что да как и куда... smile

Добавлено через 1 минуту и 20 секунд
Задачка с места работы...познавательно развивающая smile 
PM MAIL   Вверх
Uзверь
Дата 1.10.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как я понимаю мне нужно организовать чтение из лог файла по заданным параметрам выбора элементов... которые должны выводиться на экран?
PM MAIL   Вверх
amg
Дата 1.10.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Для начала попробуйте добавить что-нибудь в такой коротенький скрипт:
Код
die "Usage: $0 log.txt\n" unless @ARGV;

while (<>) {
  m/^N/ || next;
  m/A97101(\d+)\s*$/ || next;
  $hash{$1}++;
}

foreach (sort {$a<=>$b} keys %hash) {
  print "По телефону $_ звонили $hash{$_} раз\n";
}
Вызывать скрипт нужно с log-файлом в качестве аргумента

PM MAIL   Вверх
Uзверь
  Дата 1.10.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



О-o спасибо!!! Щас буду  пробывть запускать smile 
PM MAIL   Вверх
Uзверь
Дата 2.10.2009, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет amg а можно если тебя не затруднит немного пояснить вот эту строчку из програмки
 $hash{$1}++; Ее смысл
  
Насколько я понял $sash это переменная. Два плюса -приращение на 1 (инкремент) . А вот про фигурные скобки и их содержимое не очень понял.

И если можно вот в этой  стоке foreach (sort {$a<=>$b} keys %hash) такой кусок с переменными  
{$a<=>$b} ,какой смысл несет в себе такая запись для чего они служат? В описалове узнал только о временной переменной $i инициализирующаяся нулем которая создается при старте фора.

Это сообщение отредактировал(а) Uзверь - 2.10.2009, 08:12
PM MAIL   Вверх
gcc
Дата 2.10.2009, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



$hash{ключ} -

$1 - из регулярного выражения, там где (\d+)

++ записывает дальше

можно посмотреть что в хэше, сделать
Код


use Data::Dumper;
print Dumper(\%hash);

PM WWW ICQ Skype GTalk Jabber   Вверх
amg
Дата 2.10.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Uзверь @  2.10.2009,  07:53 Найти цитируемый пост)
$hash{$1}++; Ее смысл
$1 -- в ней номер телефона из предыдущего удачно сработавшего регулярного выражения. Этот номер будет ключом хэша %hash
Коеструкция $hash{$1}++; создает элемент хэша с данным ключом, если этого элемента не было и затем инкрементирует его значение (undef+1=1). Если элемент хэша с данным ключом уже есть, то его значение просто инкрементируется. 
Таким образом, получаем хэш, в котором ключи -- это номера телефонов (уникальные, в хэше иных быть не может по определению), а значения -- сколько раз этот номер телефона встречается.

Я понимаю, что приведенный мной код -- это не то, что Вам нужно, но в качестве затравки послужить может. Далее, очевидно, нужно в значения хэша помещать не количество звонков, а, например, анонимный массив или хэш с нужной информацией. Или, возможно, с самого начала делать хэш не по номерам телефонов, а по ID абонентов, если, например, сортировка по ID более важна. Готов и здесь помочь (понимаю, что окунуться сразу в структуры данных перла -- это можно и утонуть), но для этого Вы должны сказать, как должен выглядеть вывод предполагаемого скрипта (даже не просто сказать а сочинить его, например, для того куска лога, который приводили выше, точно в том виде, в котором скрипт его выдал бы).


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


Новичок



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

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



amg Очень благодарен за подробные обьяснения! smile . Вывод должен быть примерно таким. На экран должна выдаваться информация:  номер сотового телефона A9710189175023971 на который звонил абонентизнутри, уникальный идентификатор абонента (внутренний номер как в логе 5104 ) а также длительность вызова с датой как в логе 03/12 13:04:12 00:00:30

Стараюсь вразуметь что-нибудь в главе "Регулярных выражений"перл актив smile 
PM MAIL   Вверх
amg
Дата 2.10.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Uзверь @  2.10.2009,  10:11 Найти цитируемый пост)
На экран должна выдаваться информация:  номер сотового телефона A9710189175023971 на который звонил абонентизнутри, уникальный идентификатор абонента (внутренний номер как в логе 5104 ) а также длительность вызова с датой как в логе 03/12 13:04:12 00:00:30
Т.е. посто напечатать подходящие строки лога, убрав из них лишнее и переставив отдельные куски, без какой-либо статистики и сортировки? Тогда совсем просто, ни хэши, ни многомерные структуры данных не нужны:
Код
die "Usage: $0 log.txt\n" unless @ARGV;
printf "%-18s%-6s%-6s%-9s%-9s\n", qw(PHONE ID DATE TIME DURATION);
while (<>) {
  m/^N/ || next;
  m/\sA\d+\s*$/ || next;
  # 0 1   3  3       4    5   6     7        8        9  10
  # N 076 00 5104    T001 020 03/12 13:04:12 00:00:30 .0 A9710189175023971                   
  my ($ID,$date,$time,$duration,$phone) = (split)[3,6..8,10];
  printf "%-18s%-6s%-6s%-9s%-9s\n", $phone,$ID,$date,$time,$duration;
}


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


Новичок



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

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



Ничего себе програмка!!!Щас буду осваивать со скрипом smile а насчет вывода строки на экран то выводить можно всю строчку с телефоном целиком.Просто судь программы в том чтобы можно было прописать в скрипт лог и открывая его был выдан список тех кто звонил на сотовые телы.Просто список.Столбцом.А если совсем чтобы круто то чтобы скрипт анализировал временные интервалы длительности звонков и выдавал в столбец только строки тех абонентов которые его привысили smile 
PM MAIL   Вверх
amg
Дата 2.10.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Uзверь @  2.10.2009,  11:33 Найти цитируемый пост)
выводить можно всю строчку с телефоном целиком.
Тогда и скрипт то не нужен! Достаточно набрать в командной строке и исполнить команду 
perl -ne "print if /^N.+A\d+\s*$/" LOG.txt
Цитата(Uзверь @  2.10.2009,  11:33 Найти цитируемый пост)
чтобы скрипт анализировал временные интервалы длительности звонков и выдавал в столбец только строки тех абонентов которые его привысили

Задай $limit где-нибудь в начале и добавь пару строк перед printf (который в цикле):
  my ($h,$m,$s) = split /:/, $duration;
  next if $h*3600+$m*60+$s < $limit;

PM MAIL   Вверх
JackYF
Дата 3.10.2009, 10:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Uзверь, 
 ! 
JackYF
Модератор: Пожалуйста, один топик - один вопрос.
.




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


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

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


 




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


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

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