powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Как можно организовать include pl-файла?
19 сообщений из 19, страница 1 из 1
(Perl) Как можно организовать include pl-файла?
    #38546890
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть GSM-шлюз, который может принимать и отправлять SMS.
Его можно настроить таким образом, чтобы при поступлении SMS вызывалась внешняя утилита, в которую будут передаваться параметры (номер отправителя, текст сообщения, дата и т.п.). Такой утилитой будет perl-скрипт.
SMS-команды разные, каждую нужно обрабатывать по своему.
Я бы хотел сделать так:
При поступлении SMS запускается диспетчер. Он анализирует текст сообщения и вызывает скрипт, соответствующий поступившей команде. При этом вызываемые скрипты большой объем кода могут использовать повторно, поэтому общие функции и процедуры лучше собрать в одном файле, который будет использоваться разными скриптами (и лучше всего, если этим файлом будет скрипт диспетчера).
Подскажите, как подобное сделать с pl-файлами?
Я видел, как в DBI подключаются pm-модули, соответствующие разным БД, но pm-модули не очень удобно запускать для отладки.
Хотелось бы, чтобы вызываемыми скриптами были pl-файлы, которые при необходимости можно вызвать и автономно.
Про eval я знаю, но это не лучший способ.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38548370
Фотография Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вашу задачу можно решить простым процедурным подходом, либо почитайте про ООП, если не понимаете как и где подключаются 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
(Perl) Как можно организовать include pl-файла?
    #38548427
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, почитаю.
Но в принципе, require '*.pl' будет достаточно.
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38548452
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя все-таки есть неясность.
Я видел схему работы примерно такой.
Есть файл disp.pl (диспетчер, а также библиотека функций) и файлы proc1.pl, proc2.pl, proc3.pl (скрипты для выполнения определенных действий).
При поступлении SMS вызывается скрипт disp.pl.
В этом скрипте SMS анализируется, затем вызывается соответствующий procX.pl и в него передаются параметры (номер отправителя SMS, текст сообщения и пр.). Как передать в вызванный скрипт параметры? Или нужно использовать глобальные переменные?
Затем в вызванном скрипте подключается файл disp.pl. Как тут лучше избежать рекурсии? Использовать передаваемый специальный аргумент, означающий что скрипт подключен извне и ничего делать не надо, или есть какой-то штатный способ?
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38548731
Фотография Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы имеем

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

Для начала вопрос, зачем нам пункт 3?!
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38549087
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для того, чтобы общий код (различные функции) писать в одном месте, а в procX.pl эти функции вызывать.
Не обязательно, чтобы библиотекой функций был именно disp.pl, это может быть и другой файл (func.pl) или даже модуль (smsfunc.pm).
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38549198
Фотография Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Для того, чтобы общий код (различные функции) писать в одном месте, а в procX.pl эти функции вызывать.
Не обязательно, чтобы библиотекой функций был именно disp.pl, это может быть и другой файл (func.pl) или даже модуль (smsfunc.pm).
Так Вы сами себе ответили, создайте фаил functions.pl, затем подключайте его в disp.pl и procX.pl
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38549926
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каком файле будут лежать функции, это дело второе. Я думаю, что такой вариант тоже рабочий:
Код: 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
(Perl) Как можно организовать include pl-файла?
    #38549993
Фотография Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот никак не могу понять, что Вы имеете под "вызвать".

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

Вам нужно решить, нужно ли его запускать как отдельный процесс, на мой взгляд, в рамках текущей задачи - нет.
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38550188
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'};
}
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38550304
Фотография Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модули тоже можно подключать через 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
(Perl) Как можно организовать include pl-файла?
    #38550516
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отвечу в одном треде... Вот я не понимаю КАК вы умудряетесь делать ТАКИЕ костыли?..

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

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

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

ОТКУДА у вас ТАКОЕ лезет. Большего быдлокода я не видел в Перле.
Относитесь проще, давно не обращаю внимания, человек задал вопрос, я ответил, тут ведь сразу видно, что человек, к сожалению, не знаком с основами программирования совсем...
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38582499
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
(Perl) Как можно организовать include pl-файла?
    #38582844
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я все же пришел к такому варианту:
Код: 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
(Perl) Как можно организовать include pl-файла?
    #38583208
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
(Perl) Как можно организовать include pl-файла?
    #38583308
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661на каком основании интерпретатор должен сделать предположение об utf-8 природе отдельно компилируемой единицы?
Я это предположил из-за общего адресного пространства и областей видимости.
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38583333
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

вот как раз лексических переменных вызываемый через do модуль не увидит,
так что обмениваться значениями переменных нужно путём объявления этих переменных через our
...
Рейтинг: 0 / 0
(Perl) Как можно организовать include pl-файла?
    #38583341
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используя 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
19 сообщений из 19, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Как можно организовать include pl-файла?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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