Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Чтение из файла и сравнение чесла / 8 сообщений из 8, страница 1 из 1
30.09.2013, 15:24
    #38411953
newlive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Чтение из файла и сравнение чесла
Добрый день уважаемые форумчане.

Не так давно начал использовать астериск на работе, все хорошо работало(и работает) но к сожалению функция Gotoiftime меняет адрес назначения в логах.
Было принято решение принимать звонки через asterisk agi, который понимает несколько языков , в том числе и perl.
К сожалению ваш верный слуга в нем (как и в любом другом языке программирования) не разбирается.
Нагуглил пару шаблонных ивр, кое что поправил --> работает.
В данный момент хочу добавить функционал нестандартного времени для автоответчика:
тоесть

Входящий звонок--> сравнение времени с записями в файле
если истина то звонить на указанный тел

если ложь, то по стандартному расписанию
На этом функционале застрял

имеем на данный момент файл с записями (число строк не ограничено)

формат
(год : месяц : число : время : начала : время окончания : адрес назначения)

2013:9:27:1200:1900:&mob_dima
2014:9:29:1300:1500:&mob_roma
2013:10:24:1600:2300:&mob_sveta
2013:11:24:1300:2000:&mob_alena


Код: perl
1.
2.
open ( nex , "/etc/asterisk/NE_STANDARTNOE_VREMYA")  or die($!);
@massiv= <nex>;



и вот мы пришли к самому главному, не совсем понимаю как

Правильно разделить строки в файле используя заданный формат
(в данный момент активно читаю про регулярные выражения для сплит)

Организовать цикл по проверке времени

З.Ы. благодарю за любую помощь или тыканье носом в нужную сторону
...
Рейтинг: 0 / 0
30.09.2013, 17:47
    #38412147
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Чтение из файла и сравнение чесла
newlive,

чего-то типа

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#!/usr/bin/perl
use strict;
use warnings;

open (F, "</etc/asterisk/NE_STANDARTNOE_VREMYA")
    or die($!);

my ($sec,$min,$hour,$mday,$mon,$year,undef,undef,undef) = localtime(time);
my $time = sprintf("%02d%02d", $hour, $min);
my $redirect = undef;
while (<F>) {
    my @a = split /:|\r?\n/;
    next if scalar(@a) != 6;
    next if length($a[5]) == 0;
    next if ($year ne $a[0] and $mon ne $a[1] and $mday ne $a[2]);
    next if ($a[3] gt $time or $time gt $a[4]);
    $redirect = $a[5];
    last;    
}

close F;
$redirect = "9999" unless defined $redirect;
print $redirect;
...
Рейтинг: 0 / 0
30.09.2013, 17:53
    #38412159
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Чтение из файла и сравнение чесла
Андрей Панфилов,

про паддинг забыл.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
#!/usr/bin/perl
use strict;
use warnings;

open (F, "</etc/asterisk/NE_STANDARTNOE_VREMYA")
    or die($!);

my ($sec,$min,$hour,$mday,$mon,$year,undef,undef,undef) = localtime(time);
my $time = sprintf("%02d%02d", $hour, $min);
my $redirect = undef;
while (<F>) {
    my @a = split /:|\r?\n/;
    next if scalar(@a) != 6;
    next if length($a[5]) == 0;
    next if ($year ne $a[0] and $mon ne $a[1] and $mday ne $a[2]);
    $a[3] = "0" x (4 - length($a[3])) . $a[3];
    $a[4] = "0" x (4 - length($a[3])) . $a[4];
    next if ($a[3] gt $time or $time gt $a[4]);
    $redirect = $a[5];
    last;    
}

close F;
$redirect = "9999" unless defined $redirect;
print $redirect;
...
Рейтинг: 0 / 0
30.09.2013, 17:57
    #38412169
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Чтение из файла и сравнение чесла
чорт.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
#!/usr/bin/perl
use strict;
use warnings;

open (F, "</etc/asterisk/NE_STANDARTNOE_VREMYA")
    or die($!);

my ($sec,$min,$hour,$mday,$mon,$year,undef,undef,undef) = localtime(time);
my $time = sprintf("%02d%02d", $hour, $min);
my $redirect = undef;
while (<F>) {
    my @a = split /:|\r?\n/;
    next if scalar(@a) != 6;
    next if length($a[5]) == 0;
    next if ($year ne $a[0] and $mon ne $a[1] and $mday ne $a[2]);
    $a[3] = "0" x (4 - length($a[3])) . $a[3];
    $a[4] = "0" x (4 - length($a[4])) . $a[4];
    next if ($a[3] gt $time or $time gt $a[4]);
    $redirect = $a[5];
    last;    
}

close F;
$redirect = "9999" unless defined $redirect;
print $redirect;
...
Рейтинг: 0 / 0
30.09.2013, 18:03
    #38412180
newlive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Чтение из файла и сравнение чесла
Код: perl
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
($sec2,$min2,$hour2,$mday2,$mon2,$year2,$wday2,$yday2,$isdst2)=localtime($datesec);
if (length($min2) == 1) {$min2 = "0$min2";}
$tmpyear2=$year2+1900;
$tmpmon2=$mon2+1;
$AGI->exec('NoOp',"Сейчас".$wday2."   день недели    ".$hour2."   часов   ".$min2."   минут   "."$tmpyear2.$tmpmon2.$mday2\_в_$hour2:$min2");
$var =$hour2.$min2;
open ( nex , "/etc/asterisk/phones/NE_STANDARTNOE_VREMYA")  or die($!);
@massiv= <nex>;
foreach $i (@massiv) {
($god,$mesyac,$chislo,$nachalo,$konec,$neydachneg)= split (/:/, $i);
#$AGI->exec('NoOp',"$neydachneg");
if (($god==$tmpyear2)&&($mesyac==$tmpmon2)&&($chislo==$mday2)&&($nachalo<=$var && $konec>=$var)){&$neydachneg;}
$AGI->exec('NoOp',$i);
};



сейчас так работает =)
...
Рейтинг: 0 / 0
30.09.2013, 18:04
    #38412181
newlive
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Чтение из файла и сравнение чесла
решил считывать каждую строку в массив а потом по очереди делю строку и сравниваю...
...
Рейтинг: 0 / 0
30.09.2013, 18:08
    #38412185
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Чтение из файла и сравнение чесла
еще раз, чорт.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
#!/usr/bin/perl
use strict;
use warnings;

open (F, "</etc/asterisk/NE_STANDARTNOE_VREMYA")
    or die($!);

my ($sec,$min,$hour,$mday,$mon,$year,undef,undef,undef) = localtime(time);
my $time = sprintf("%02d%02d", $hour, $min);
my $redirect = undef;
while (<F>) {
    my @a = split /:|\r?\n/;
    next if scalar(@a) != 6;
    next if length($a[5]) == 0;
    next unless ($year + 1900 eq $a[0] and $mon + 1 eq $a[1] and $mday eq $a[2]);
    $a[3] = "0" x (4 - length($a[3])) . $a[3];
    $a[4] = "0" x (4 - length($a[4])) . $a[4];
    next if ($a[3] gt $time or $time gt $a[4]);
    $redirect = $a[5];
    last;    
}

close F;
$redirect = "9999" unless defined $redirect;
print $redirect;
...
Рейтинг: 0 / 0
25.11.2013, 08:03
    #38476136
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Чтение из файла и сравнение чесла
newliveрешил считывать каждую строку в массив а потом по очереди делю строку и сравниваю...

если у файла " число строк не ограничено ", потребуется много памяти,
поэтому просто построчно читать:

for ( < nex > ) {
($god, $mesyac, $chislo, $nachalo, $konec, $neydachneg) = split ':';
}

какой там цикл нужен "по проверке времени" и связь с автоответчиком нуждается в пояснении -> думать невыносимо и читать докум. по астериску тоже)
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Чтение из файла и сравнение чесла / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]