Автор Тема: Модули и значения ими возвращаемые  (Прочитано 7806 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Модули и значения ими возвращаемые
« : 14 Февраля 2005, 17:49:40 »
Вот дорос(наверное) недавно, до создания своих модулей. И тут же обзавелся рядом вопросов.

Например, раннее мне требовалось написать какой-то sub, который бы возвращал несколько значений, то я писал нечто сродни этому
 
sub myfunc
(???) {
# Здесь что-то делал с переменными
}

Вызывал из скрипта чем-то подобным

&myfunc($val1,$val2,$val3);
Но теперь такой вариант не прокатывает.
Мне нужно в модуле обработать уже имеющуюся функцию и получить несколько значений назад. причем каждое из значений передать строго определенным переменным/массивам.
насколько я понимаю нужно смотреть в сторону return в sub, но вот не понимаю как.

например если я напишу так в модуле

 
sub myfunc 
{
# Здесь что-то делал с переменными
return ($val1,$val2);
}


А вызывать буду на подобе такого:

 
our 
(val1,val2);
&
myfunc;



То в модуль сделает все необходимые операции и вернет именно моим, указанным в скрипте, а не модуле $val1,$val2 переменным значение? А как же их тогда объявлять при наличии use struct в модуле?
Всё будет хорошо - я договорился!

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Модули и значения ими возвращаемые
« Ответ #1 : 14 Февраля 2005, 18:15:46 »
Skif

в модуле:

package MyModule;
...

sub my_func {
my ($var1, $var2) = @_;
...
return ($var1, $var2)
}

в скрипте:

($var1, $var2) = MyModule->my_func($var1, $var2);

Что-то типа того...
Только вот не помню, может в процедуру первая переменная передается имя модуля... навскидку не скажу

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Модули и значения ими возвращаемые
« Ответ #2 : 14 Февраля 2005, 18:18:11 »
Спасибо, что хоть так подпихнули, сейчас покопаю дальше, бо стал и не знаю что делать. В скриптах половина функций повторяется. Вот и решил переходить на модули. ;)
Всё будет хорошо - я договорился!

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Модули и значения ими возвращаемые
« Ответ #3 : 15 Февраля 2005, 10:20:31 »
Phoinix
------------------------------------------------------
package MyModule;
...
sub new
{
 my $self={};
 bless($self);
 return $self;
}
sub my_func {
 my $self = shift;
 my %HKeys = @_;
 my $var1= $HKeys{\'var1\'};
 my $var2= $HKeys{\'var2\'};
 ...
 return ($var1, $var2)
}

в скрипте:
use MyModule;
my $MD=MyModule->new();
($var1, $var2) = $MD->my_func(var1=>$var1, var2=>$var2);
или:
use MyModule;
($var1, $var2) = MyModule->my_func(var1=>$var1, var2=>$var2);
And no religion too...

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Модули и значения ими возвращаемые
« Ответ #4 : 15 Февраля 2005, 11:28:47 »
Тут вот споткнулся на таком, практически не получается достучаться до моего модуля, тобишь все описано, но вот когда пускаю скрипт, где вызывается мой модуль пишет:

skif
@server /usr/local/script/testsquid/:./test.pl
Can
\'t locate object method "readconfig" via package "module_perl" (perhaps you forgot to load "module_perl"?) at ./test.pl line 5.
skif@server /usr/local/script/testsquid/:


Я его ложил как рядом со своим скриптом, так и к остальным модулям perl-а в системе. У меня они лежат
/usr/local/lib/perl5/5.6.1/
Может нужно как-то "объяснить" перлу, что установлен новый модуль, что бы он включил его в свои переменные окружения?
Всё будет хорошо - я договорился!

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Модули и значения ими возвращаемые
« Ответ #5 : 15 Февраля 2005, 11:30:55 »
Упс, вопрос снимается. час бился там, где, оказывается проблема выеденного яйца не стоит. - фишка в том, чтьо модуль в коде обозвал по одному, а сам файл по другому.
Всё будет хорошо - я договорился!

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Модули и значения ими возвращаемые
« Ответ #6 : 15 Февраля 2005, 12:03:53 »
Skif
на будушее используй:
use lib \'.\';
And no religion too...

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Модули и значения ими возвращаемые
« Ответ #7 : 15 Февраля 2005, 12:57:51 »
Вот в догонку еще вопрос, тоже сейчас мучаюсь. У меня ряд функций ушло в модуль без проблем, они в основном отдают параметры, но мне нужно в модуль передать переменную, как это реализовать.
кострукция вида С\\Delphi не работает :( :

sub some_sub
($val1,$val2) {
$val3 $val1+$val3;
return 
$val3;
}


Куча ругани и т.д:

skif
@server /usr/local/script/testsquid/:./test.pl
Possible attempt to separate words with commas at squiddb
.pm line 5.
Global symbol "$val1requires explicit package name at squiddb.pm line 67.
Global symbol "$val2requires explicit package name at squiddb.pm line 67.
Compilation failed in 
require at ./test.pl line 3.
BEGIN failed
--compilation aborted at ./test.pl line 3.
Всё будет хорошо - я договорился!

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Модули и значения ими возвращаемые
« Ответ #8 : 15 Февраля 2005, 13:11:14 »
Тоже снимаю, все проще чем мир

sub mysub 
(???) {
shift @_#Вернет имя модуля
my ($result,$val1,$val2);
$val1=shift @_;
$val2=shift @_;
result $val $val2;
return 
$result;

}
Всё будет хорошо - я договорился!

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
Модули и значения ими возвращаемые
« Ответ #9 : 15 Февраля 2005, 14:09:42 »
Я так понял, ООП не используется, тогда какой смысла работать с классами (это именно классы, а не модули), если достаточно обычных пакетов и экспортера?

Кстати, касательно приема параметров. Если знать, что "магический" массив @_ содержит список переданных в функцию / метод параметров, то можно записать все так:
my ($val1, $val2) = @_;
Или, если нужно отбросить инвокант:
my (undef, $val1,$val2) = @_;
There Is More Than One Way To Do It (c)

Оффлайн Skif

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 187
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Модули и значения ими возвращаемые
« Ответ #10 : 15 Февраля 2005, 14:21:11 »
К сожалениюв той  доке, по которой я работаю, а именно "Programming Perl" от o\'Reilly, описана работа с модулями именно так. Для OOП для меня слишком путано и несколько не понятно на данном этапе, посему я отталкивался от основного метода, не ООП, что в итоге вышло, не знаю, но скрипты работают.
Кстати, можете пояснить значение invocant, я никак его понять не могу?
Всё будет хорошо - я договорился!

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
Модули и значения ими возвращаемые
« Ответ #11 : 15 Февраля 2005, 16:37:36 »
commander в своем сообщении привел пример простого класса, состоящего из конструктора и метода. Я бы не советовал использовать ООП там, где в этом нет необходимости. Кроме того, если ты не знаком с ООП его применение в перле без базового изучения может даже навредить.

В кэмэлбуке есть две главы (10 и 11), которые посвящены пакетам и модулям. Этой информации, а так же соответствующей страницы руководства и документации по модулю Exporter вполне достаточно, чтоб получить основную информацию по данному вопросу. Если планируешь тесно работать с перлом, обязательно обзаведись кукбуком. В книге содержится множество ответов на часто задаваемые вопросы, в том числе касательно пакетов и модулей.

Ну и пример простого модуля:

package MyModule
;
use 
strict;
use 
base Exporter
# для ранних версий перла
# use Exporter;
# our @ISA = qw(Exporter);
our @EXPORT qw(foo);

foo
{
	
my $name shift;
	
print 
"Hi, my name is $name\\n";
}
1;


Пример использования в скрипте. Функция foo автоматически импортируется и ее можно вызывать так, как будто бы она была объявлена в самом скрипте.

use MyModule;
use 
strict;
foo("2nf");
There Is More Than One Way To Do It (c)

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Модули и значения ими возвращаемые
« Ответ #12 : 16 Февраля 2005, 09:35:10 »
2NetFly
Цитировать
Я бы не советовал использовать ООП там, где в этом нет необходимости. Кроме того, если ты не знаком с ООП его применение в перле без базового изучения может даже навредить.

Что за манера пугать людей ООП?!?! Это не БАБАЙ, которым пугают детей! В Перле ООП вообще элементарная вещь! И ничего страшного от его применения не будет!
And no religion too...

Оффлайн 2NetFly

  • Модератор
  • Глобальный модератор
  • Постоялец
  • *****
  • Сообщений: 144
  • +0/-0
  • 0
    • Просмотр профиля
    • http://feotast.net
Модули и значения ими возвращаемые
« Ответ #13 : 16 Февраля 2005, 10:15:21 »
Если человек не знаком с ООП и начнет его изучения с перла, он может быть немного удивлен, когда встретится с "правильным" ООП в C++ или Java.

Автору темы нужны модули, а не классы, и не стоит его путать. Какой смысл в ООП, если не используется ни одна их трех его основополагающих парадигм? Как говорил Фаулер, нет ничего ужаснее ООП программы в процедурном стиле ;=)
There Is More Than One Way To Do It (c)

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Модули и значения ими возвращаемые
« Ответ #14 : 16 Февраля 2005, 10:21:04 »
Цитировать
с "правильным" ООП в C++ или Java.

ага...? Ну поведай нам тогда чем же правильное ООП (в C++ или Java) отличаеться от "не правильного" (реализованного на PERL)?
And no religion too...

 

Sitemap 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