Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Как можно организовать include pl-файла? / 19 сообщений из 19, страница 1 из 1
03.02.2014, 11:04
    #38546890
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Есть GSM-шлюз, который может принимать и отправлять SMS.
Его можно настроить таким образом, чтобы при поступлении SMS вызывалась внешняя утилита, в которую будут передаваться параметры (номер отправителя, текст сообщения, дата и т.п.). Такой утилитой будет perl-скрипт.
SMS-команды разные, каждую нужно обрабатывать по своему.
Я бы хотел сделать так:
При поступлении SMS запускается диспетчер. Он анализирует текст сообщения и вызывает скрипт, соответствующий поступившей команде. При этом вызываемые скрипты большой объем кода могут использовать повторно, поэтому общие функции и процедуры лучше собрать в одном файле, который будет использоваться разными скриптами (и лучше всего, если этим файлом будет скрипт диспетчера).
Подскажите, как подобное сделать с pl-файлами?
Я видел, как в DBI подключаются pm-модули, соответствующие разным БД, но pm-модули не очень удобно запускать для отладки.
Хотелось бы, чтобы вызываемыми скриптами были pl-файлы, которые при необходимости можно вызвать и автономно.
Про eval я знаю, но это не лучший способ.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
04.02.2014, 12:34
    #38548370
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
вашу задачу можно решить простым процедурным подходом, либо почитайте про ООП, если не понимаете как и где подключаются pm фаилы и отладка связанная с ними.

Код: php
1.
2.
3.
4.
5.
6.
require "someFunctions.pl";
my $action = $ARGV[0];

if ($action eq "saveToDatabase") {saveToDatabase();}
elsif ($action eq "runExternalApplication") {runEA();}
else {...}



фаил someFunctions.pl
Код: php
1.
2.
3.
4.
5.
...
sub saveToDatabase {print "bla bla bla";}
sub runEA{print "xyz";}
...
1;
...
Рейтинг: 0 / 0
04.02.2014, 12:54
    #38548427
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Спасибо, почитаю.
Но в принципе, require '*.pl' будет достаточно.
...
Рейтинг: 0 / 0
04.02.2014, 13:02
    #38548452
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Хотя все-таки есть неясность.
Я видел схему работы примерно такой.
Есть файл disp.pl (диспетчер, а также библиотека функций) и файлы proc1.pl, proc2.pl, proc3.pl (скрипты для выполнения определенных действий).
При поступлении SMS вызывается скрипт disp.pl.
В этом скрипте SMS анализируется, затем вызывается соответствующий procX.pl и в него передаются параметры (номер отправителя SMS, текст сообщения и пр.). Как передать в вызванный скрипт параметры? Или нужно использовать глобальные переменные?
Затем в вызванном скрипте подключается файл disp.pl. Как тут лучше избежать рекурсии? Использовать передаваемый специальный аргумент, означающий что скрипт подключен извне и ничего делать не надо, или есть какой-то штатный способ?
...
Рейтинг: 0 / 0
04.02.2014, 15:09
    #38548731
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Мы имеем

1. Запускаем фаил disp.pl, передаем в него данные о смс
2. В файле disp.pl запускаем фаил procX.pl на основании анализа данных
3. Подключаем в файле procX.pl фаил disp.pl

Для начала вопрос, зачем нам пункт 3?!
...
Рейтинг: 0 / 0
04.02.2014, 17:31
    #38549087
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Для того, чтобы общий код (различные функции) писать в одном месте, а в procX.pl эти функции вызывать.
Не обязательно, чтобы библиотекой функций был именно disp.pl, это может быть и другой файл (func.pl) или даже модуль (smsfunc.pm).
...
Рейтинг: 0 / 0
04.02.2014, 18:31
    #38549198
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Alibek B.Для того, чтобы общий код (различные функции) писать в одном месте, а в procX.pl эти функции вызывать.
Не обязательно, чтобы библиотекой функций был именно disp.pl, это может быть и другой файл (func.pl) или даже модуль (smsfunc.pm).
Так Вы сами себе ответили, создайте фаил functions.pl, затем подключайте его в disp.pl и procX.pl
...
Рейтинг: 0 / 0
05.02.2014, 11:47
    #38549926
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
В каком файле будут лежать функции, это дело второе. Я думаю, что такой вариант тоже рабочий:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
if (@ARGV) {
  #если переданы аргументы, значит скрипт был
  #вызван GSM-шлюзом на пришедшее сообщение
  #при подключении файла через require @ARGV
  #будет пустым и этот блок кода выполняться
  #не будет, а использоваться будут только функции
}

sub func1 {
  ...
}
sub func2 {
  ...
}
...



Я пока застрял на другом. Я не могу сообразить, как из диспетчера вызвать другой скрипт procX.pl.
Через require ( if ($action eq 'proc1') {require "proc1.pl"} )? Или можно как-то более грамотно?
...
Рейтинг: 0 / 0
05.02.2014, 12:19
    #38549993
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Я вот никак не могу понять, что Вы имеете под "вызвать".

Смотрите, скрипт можно подключать , через require/use, либо запускать как отдельный процесс через ``/system/exec.

Вам нужно решить, нужно ли его запускать как отдельный процесс, на мой взгляд, в рамках текущей задачи - нет.
...
Рейтинг: 0 / 0
05.02.2014, 13:44
    #38550188
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Да, термины я использую неправильно.
Скрипт мне нужно подключить.
И видимо использовать нужно require, т.к. у меня не модуль.

Под "вызвать" я имею ввиду возможность передачи аргументов вызванному скрипту.
То есть чтобы скрипт одинаково отработал в следующих способах запуска:

1. perl proc1.pl arg1 arg2

2. require "proc1.pl" ('arg1' 'arg2')

Ну а в скрипте proc1.pl обрабатываются @ARGV.

Но поскольку синтаксиса 2 не существует, придется делать как-то так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#proc1.pl

if (@ARGV) {
  #скрипт запущен вручную, используются переданные аргументы
  $param1 = shift;
  $param2 = shift;
} else {
  #скрипт подключен через require, аргументы в глобальной переменной
  $param1 = $global{'param1'};
  $param2 = $global{'param2'};
}
...
Рейтинг: 0 / 0
05.02.2014, 14:31
    #38550304
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Модули тоже можно подключать через require, разница между use в том, что подключаться они на разных стадиях исполнения.

Вам нужно передавать параметры не в подключаемые файлы, а в функции, которые хранятся в них
Код: php
1.
2.
3.
require "functions.pl";

func1($ARGV[0], $ARGV[1]);


functions.pl
Код: php
1.
2.
3.
4.
5.
sub func1 
{
	print shift; #напечатает то что было в ARGV[0];
	print shift; # ---//--- в ARGV[1];
}
...
Рейтинг: 0 / 0
05.02.2014, 15:51
    #38550516
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Отвечу в одном треде... Вот я не понимаю КАК вы умудряетесь делать ТАКИЕ костыли?..

Нормальные люди пользуют Class::Load допустим и pm'ники... Они пользуют lib::abs для относительных путей и т.д. и т.п.

ОТКУДА у вас ТАКОЕ лезет. Большего быдлокода я не видел в Перле.
...
Рейтинг: 0 / 0
05.02.2014, 15:57
    #38550541
Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
WarstoneОтвечу в одном треде... Вот я не понимаю КАК вы умудряетесь делать ТАКИЕ костыли?..

Нормальные люди пользуют Class::Load допустим и pm'ники... Они пользуют lib::abs для относительных путей и т.д. и т.п.

ОТКУДА у вас ТАКОЕ лезет. Большего быдлокода я не видел в Перле.
Относитесь проще, давно не обращаю внимания, человек задал вопрос, я ответил, тут ведь сразу видно, что человек, к сожалению, не знаком с основами программирования совсем...
...
Рейтинг: 0 / 0
10.03.2014, 19:00
    #38582499
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Alibek B.Да, термины я использую неправильно.
Скрипт мне нужно подключить.
И видимо использовать нужно require, т.к. у меня не модуль.

Под "вызвать" я имею ввиду возможность передачи аргументов вызванному скрипту.
То есть чтобы скрипт одинаково отработал в следующих способах запуска:

1. perl proc1.pl arg1 arg2

2. require "proc1.pl" ('arg1' 'arg2')

Ну а в скрипте proc1.pl обрабатываются @ARGV.

Но поскольку синтаксиса 2 не существует, придется делать как-то так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#proc1.pl

if (@ARGV) {
  #скрипт запущен вручную, используются переданные аргументы
  $param1 = shift;
  $param2 = shift;
} else {
  #скрипт подключен через require, аргументы в глобальной переменной
  $param1 = $global{'param1'};
  $param2 = $global{'param2'};
}




require или do тут никак не прицепишь,

только через вызов подпроцесса, увы

Код: perl
1.
$result = ` proc1.pl  arg1 arg2 `;
...
Рейтинг: 0 / 0
11.03.2014, 12:18
    #38582844
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Ну я все же пришел к такому варианту:
Код: 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.
26.
27.
28.
29.
30.
$::ARG =
{
	'phone'=>$phone,
	'command'=>$rcmd,
	'text'=>$text,
};
my $time = time;
$ret = do($rsub); # код в файле $rsub возвращает либо число, либо хеш {'code'=>returncode, 'message'=>returntext}
$val = $@||0;
$duration = time - $time;
if ($ret)
{
	if (ref($ret) eq "HASH")
	{
		$rc->{'return'} = "Запрос обработан";
		$rc->{'data'} = $ret->{'message'};
		$rc->{'response'} = $ret->{'response'};
	}
	else
	{
		$rc->{'return'} = "Запрос обработан";
		$rc->{'data'} = "Код возврата $ret";
	}
}
else
{
	$rc->{'return'} = "Ошибка обработки";
	$rc->{'data'} = $val;
}
$::ARG = undef;



Обнаружил такой баг.
У меня скрипты сохранены в UTF-8, в основном скрипте указано use utf8.
Вызываемый скрипт (файл $rsub) также сохранен в UTF-8. Но если в нем не указать use utf8, то Perl его кодировку интерпретирует не как UTF-8 и кириллица (строковые константы) нечитаемая, в вызываемом файле также нужно использовать use utf8.
...
Рейтинг: 0 / 0
11.03.2014, 17:27
    #38583208
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Alibek B.Обнаружил такой баг.
У меня скрипты сохранены в UTF-8, в основном скрипте указано use utf8.
Вызываемый скрипт (файл $rsub) также сохранен в UTF-8. Но если в нем не указать use utf8, то Perl его кодировку интерпретирует не как UTF-8 и кириллица (строковые константы) нечитаемая, в вызываемом файле также нужно использовать use utf8.


Ну так исправь свою ошибку и укажи use utf8 и в вызываемом файле тоже -
на каком основании интерпретатор должен сделать предположение об utf-8 природе отдельно компилируемой единицы? ( хотя пару лет назад читал, что таким основанием может стать метка BOM
в начале файла и даже проверил под виндусом - тогда не сработало ).

а вот
Код: perl
1.
 eval `cat $rsub` 

должен по-моему сработать и без доп. use utf8 .
...
Рейтинг: 0 / 0
11.03.2014, 19:15
    #38583308
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
volodin661на каком основании интерпретатор должен сделать предположение об utf-8 природе отдельно компилируемой единицы?
Я это предположил из-за общего адресного пространства и областей видимости.
...
Рейтинг: 0 / 0
11.03.2014, 19:42
    #38583333
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
Alibek B.,

вот как раз лексических переменных вызываемый через do модуль не увидит,
так что обмениваться значениями переменных нужно путём объявления этих переменных через our
...
Рейтинг: 0 / 0
11.03.2014, 19:57
    #38583341
volodin661
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Как можно организовать include pl-файла?
используя Benchmark , %ENV и заменив if на тернарный оператор в столбик:

Код: perl
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
]

use strict;
use Benchmark;

my $rsub = "1.pl";

# fill input
$ENV{'ali_phone'}	    = "111-1-1-1-1";
$ENV{'ali_command'}	    = "#!AP!10";
$ENV{'text'}		    = "text";
# prepare output
$ENV{'ali_return'}	    = undef;
$ENV{'ali_data'}	    = undef;
$ENV{'ali_response'} 	    = undef;

my $t0 = Benchmark->new;
# do it!
do $rsub or die my $msg =
	            ( $@ )?
	            "Can't compile file $rsub, $@"
	            :( $!)?
	            "Can't read file $rsub, $!"
	            : "no chance be here";

my $t1 = Benchmark->new;
my $td = timediff($t1, $t0);

#check values in %ENV rendered by $rsub
print $ENV{'ali_return'}, v10;
print $ENV{'ali_data'}, v10;
print $ENV{'ali_response'}, v10;

print timestr( $td );
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Как можно организовать include pl-файла? / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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