Вопросы по PERL

Модератор: Модераторы разделов

netguard
Сообщения: 30

Вопросы по PERL

Сообщение netguard »

Ситуация такая. Нужно в зависимости от параметра командной строки вызвать нужную функцию, но есть множества ньюансов.
У меня есть один главный perl сценарий, в котором есть так скажем основной набор маленьких функций, т.е. грубо говоря core. И должно быть множество других функций, в которых я просто напросто использую свои core-функции. Писать это множество функций внутри - не хочется, а хочется для каждой функции свой perl-скрипт, у которых будет функция с одним и тем же именем, например - test.
т.е. что-то типа :

Код: Выделить всё

sub core1;
sub core2;
...

include $expr;
# в expr мой сценарий в котором находится функция test, и которая использует core функции
...
test(@params);
#функция test описана и реализована в $expr скрипте


Можно ли что-то подобное сделать в Perl ? Да я знаю что include нету в perl, я плохо знаю perl, редко с ним работаю, слышал только о use/requeire, но они вроде бы только пакеты pm загружают, а мне нужно чтобы типа как в php, файлик со моими функциями/данными.
Спасибо сказали:
Аватара пользователя
ояб
Сообщения: 107
ОС: FreeBSD

Re: Вопросы по PERL

Сообщение ояб »

Оформи файлик как пакет и загружай при помощи require
Спасибо сказали:
netguard
Сообщения: 30

Re: Вопросы по PERL

Сообщение netguard »

Если это единственный выход, пойду читать доку по созданию и оформлению пакетов, надеюсь это не займет много времени ...
Спасибо сказали:
Аватара пользователя
ояб
Сообщения: 107
ОС: FreeBSD

Re: Вопросы по PERL

Сообщение ояб »

Код: Выделить всё

package test;

1;


Вот минимальное оформление.
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64

Re: Вопросы по PERL

Сообщение vadiml »

можно так же из пакета экспортировать функции в главное тело программы, а сам пакет подключать по use

а можно вообще написать do и не оформлять его как пакет -- это будет почти как вставка куска кода в место вызова через do, только обработка ошибок будет по другому выглядеть, что, иногда, бывает удобно
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
Аватара пользователя
ояб
Сообщения: 107
ОС: FreeBSD

Re: Вопросы по PERL

Сообщение ояб »

Можно и по use и оформить как модуль. Через use модуль будет подключатся на этапе компиляции, через require на этапе выполнения.

например так, файлик Test.pm

Код: Выделить всё

package Test;
BEGIN {
   use Exporter ();
   @ISA = 'Exporter';
   @EXPORT = '&test';
}
# Тут ты пишешь свою функцию
sub test { ... }
1;


Потом в основной программе или где понадобится

Код: Выделить всё

Подключаешь модуль
use Test;
#Вызываешь функцию
test();


Если не экспортировать функции в глобальную область видимости, а тебе видимо так и надо, чтоб в каждом модуле была функция с одним именем, тогда не надо оформлять блок BEGIN как я выше писал. Функции вызывать так:

Код: Выделить всё

Test::test();

Но сейчас в мире perl принято оформлять пакеты как классы. Поэтому лучше еще создай в каждом модуле конструктор и обращайся к каждой функции через объект.
Спасибо сказали:
netguard
Сообщения: 30

Re: Вопросы по PERL

Сообщение netguard »

да, видимо это сделать невозможно.
Имя модуля должно совпадать с именем модуля на диске

А мне то как раз нужно чтобы имена физические были разные, а имена модулей одинаковые.

Вот пример чего я хотел сделать:
Файл который запускаем с параметром:

Код: Выделить всё

#!/usr/bin/perl

 @INC = qw(
          ./
        );

$num=$ARGV[0];

require test.$num;

Test::test();

Модули в которых функция test реализована

Код: Выделить всё

#test1.pm
package Test;

sub test
{
    print "Test 1\n";
}

1;

#test2.pm
package Test;

sub test
{
    print "Test 2\n";
}

1;



А можно ли что-нибудь с помощью eval сделать ? Например :

Код: Выделить всё

eval { Test.$num::test() };


Я попробовал - не получилось, ошибки выдает. Модули переименовал в соотвествии с их физическими именами на диске.
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64

Re: Вопросы по PERL

Сообщение vadiml »

Так сделай в одном модуле несколько пакетов

ЗЫ что бы объявить

use Exporter ();
@ISA = 'Exporter';
@EXPORT = '&test';

блок BEGIN не нужен, и так всё сработает
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
netguard
Сообщения: 30

Re: Вопросы по PERL

Сообщение netguard »

ok, попробую.

----
2 vadiml
спасибо, твой способ с do самый лучший и эффективный, с помощью него все работает как раз так, как и хотел.

Код: Выделить всё

$num=1;
$var="my_var";
do "test".$num.".pl";
# test1.pl
sub test
{
    print "Test 1, $var\n";
}

test();

:thumbs:
Спасибо сказали:
Аватара пользователя
unax
Сообщения: 275
ОС: Linux

Re: Вопросы по PERL

Сообщение unax »

Народ!

Такая ситуация.
Надо написать консольную программу под UNIX-овые ОС (FreeBSD скажем), реализующую несколько "форм" с полями для ввода данных, содержащими меню для перехода между формами или какое-то их подобие. (Ну в стиле Midnight Commander или допустим sysinstall во FreeBSD) Очень хочется реализовать сие в Perl.
Вот в чем вопрос: умеет ли это Perl? И какие модули требуются (вообще куда смотреть). Или на чем еще это сделать? C++ логично… если в С++ то тоже что там за модули или где почитать, может кто-то уже реализовывал нечто подобное?

Надеюсь вопрос понятен.
Жду совета от знающих людей. Заранее благодарю. :drinks:

p.s.
Не скажу, что я чайник в программировании… но просто такая область знаний, что сколько не изучай – все равно себя порой чувствуешь дилетантом ;) Собственно в Windows такое делалось еще на начальном этапе моих программерских изощрений.
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Вопросы по PERL

Сообщение sergio »

Код: Выделить всё

$ aptitude search curses | grep perl
p   libcurses-perl                  - Curses interface for Perl
p   libcurses-ui-perl               - curses-based OO user interface framework f
p   libcurses-widgets-perl          - Curses widget interface for Perl
v   perl-curses
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали: