Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Ищу]Модуль для добавления формальных параметров 
:(
    Опции темы
Logo
Дата 18.10.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Чтобы можно было писать что-то вроде этого
Код

    sub mySub ($arg1, $arg2 = 2, $arg3 = 3, @all_other) {}

Подобная вещь есть в PlusPlus, но надо еще чтобы количество параметров проверяло, и другие опции этого модуля не нужны.
PM MAIL   Вверх
DaemonSuw
Дата 18.10.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 11.3.2008

Репутация: 3
Всего: 3



Код

use Data::Dump qw/dump/;
$a = 1;
@c = (10,20,33);
mysub ($a, ($b = 3), @c);

sub mysub {
  print dump (@_);
}


+ добавить в mysub - прототипы?
PM MAIL ICQ   Вверх
Logo
Дата 19.10.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Нет, нужны именно формальные параметры, как в остальных языках программирования.
PM MAIL   Вверх
arto
Дата 19.10.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



либо используйте hash, либо пишите свой фильтр.

а для чего нужны формальные параметры?
PM MAIL ICQ   Вверх
Logo
Дата 20.10.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Хотел сначала узнать, нет ли готового решения, чтобы велосипед не изобретать.

Цитата

а для чего нужны формальные параметры? 

Чтобы у переменных были понятные названия, а не $_[n], и не вытаскивать их руками.
Чтобы значения по умолчанию необязательным параметрам не прописывать руками.
Чтобы автоматически контролировать число параметров, передаваемых функции.
Чтобы автоматически контролировать тип значения (на уровне ссылка на массив, хеш, sub и т.п.).
PM MAIL   Вверх
KSURi
Дата 21.10.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(Logo @  20.10.2009,  18:10 Найти цитируемый пост)
Чтобы у переменных были понятные названия, а не $_[n], и не вытаскивать их руками.
Чтобы значения по умолчанию необязательным параметрам не прописывать руками.
Чтобы автоматически контролировать число параметров, передаваемых функции.
Чтобы автоматически контролировать тип значения (на уровне ссылка на массив, хеш, sub и т.п.). 

MooseX::Method::Signatures предоставляет эти возможности. И еще много других, которые могут показаться лишними.
Может проще другой язык выбрать?


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
korob2001
Дата 21.10.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Можно передать хеш или же ссылку на него, вот и получишь именованные параметры.
Код

mysub(
    key1 => "val1",
    key2 => "val2",
    key3 => "val3",
);


sub mysub {
    my %param = @_;
    
    # Выводим значение первого и третьего параметра, значение получаем по имени
    print $param{key1} . "\n";
    print $param{key3} . "\n";
}

Для того, что бы у параметров были значения по умолчанию, нужно заполнить этот хеш внутри функции.
Код

mysub(
    key1 => "val1",
    key2 => "val2",
    key3 => "val3",
);


sub mysub {
    my %param = (
        key3 => "def3",
        key4 => "def4",
        @_
    );
    
    # Выводим все полученные параметры
    print "$_ => $param{$_}\n" for keys %param;
}


Что бы контролировать число параметров воспользуйся прототипами:
Код

#!/usr/bin/perl -w
use strict;

sub mysub($) {
    my $param = {
        key3 => "def3",
        key4 => "def4",
        %{$_[0]}
    };
    
    # Выводим все полученные параметры
    print "$_ => $param->{$_}\n" for keys %{$param};
}

mysub({
    key1 => "val1",
    key2 => "val2",
    key3 => "val3",
});

# Следующая строка выдаст ошибку Too many arguments for main::mysub
#mysub(1, 2);

Ну а что касается типов переменных, то Perl не относится к строго типизированным языкам. И определять хеш ты получил или массив, как правило не нужно, потому как нам известно что $ - скаляр, @ - массив, % - хеш. С ссылками дело обстоит несколько иначе, но для определения того, на что ссылается ссылка, можно воспользоваться ref.

Вывод: Java - это Java, Perl - это Perl. Хочешь строгой типизации используй модули Inline или же пиши изначально на строго типизированном языке.



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Logo
Дата 21.10.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



KSURi
Этот модуль только для методов работает, для отдельных sub нет?
Цитата

MooseX::Method::Signatures - Method declarations with type constraints and no source filter

А как же он тогда работает smile?

korob2001
Спасибо, интересный метод.
Цитата

Вывод: Java - это Java, Perl - это Perl. Хочешь строгой типизации используй модули Inline или же пиши изначально на строго типизированном языке.

Не совсем согласен, но спорить не буду.
PM MAIL   Вверх
gcc
Дата 22.10.2009, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



а зачем нужна типизация вообще?
это только защита от извращенцев, не более того?

вот я не давно видел программку  smile 

Код

package qxp;
use strict;

sub H($){pack'H*',$_[0]}
sub by{map{[splice@_,1,$_[0]]}!($#_%$_[0])..$#_/$_[0]}
sub is($){$_ eq$_[0]}
sub cat{join'',@_}
sub list{@_}
sub wa{wantarray?@_:cat@_}
sub yuki(&@){shift->();@_}
sub fopen(;$){open my$z,$_[0]||$_;$z}{my %file;
sub file($){readline($file{$_[0]}||=fopen$_[0])}}
sub slurp(;$){wa map{yuki{close$_}<$_>}fopen$_[0]}
#sub spew($;$){sub{map{print $_ $_[1];close$_}fopen$_[0]}->($_[0],$#_?$_[1]:$_)}
sub spew($;$){open my$z,">$_[0]";print $z $#_?$_[1]:$_;close $z}
sub table{map{chomp;[split/\t/]}@_}
sub trim{map{s/^\s+|\s+$//g}@_?@_:$_}
sub count{my%z;$z{$_}++for@_;\%z}
sub uniq{keys%{count@_}}
sub copy{wa local@_=@_}
sub find(&@){no strict 'refs';local(*{(caller).'::a'})=\(my$a=$_[1]);&{$_[0]}||($a=$_)for(@_[2..$#_]);$a}
sub first(&@){$_[0]->()&&return$_ for@_[1..$#_]}
sub min{find{$a<$_}@_}
sub max{find{$a>$_}@_}
sub section{map{$_->[$_[0]]}@_[1..$#_]}
*#=sub{map$#$_,@_};
sub zip{map section($_,@_),0..max &#(@_)}
sub char{substr$#_?shift:$_,$_[0],1}
sub via(&$){local $_=$_[1];$_[0]->()}

*\=sub{map[section($_,@_)],0..max &#(@_)};

{my%ops;*?=sub{ref$_[-1]?map&?($_[0],@$_),&\(@_[1..$#_]):wa do{my@z=$_[1];@z=$ops{$_[0]}->($_,@z)for@_[2..$#_];@z}};
{no strict 'refs';(*$_,$ops{$_})=eval"sub{&?('$_',\@_)},sub{wa(\@_[1..\$#_]) $_ \$_[0]}" for qw'** =~ !~ * / % x + - . << >> < > <= >= lt gt le ge == != <=> eq ne cmp & | ^ && || .. ... = , => and or xor'}}
my%refs=(''=>'_',map{$_=>lc substr $_,0,1}qw{SCALAR ARRAY HASH CODE REF GLOB LVALUE});
sub refs{wa map{$refs{ref $_}||'o'}@_}
sub _{cat map{
  is '' ? $_:
  is 'a' ? @{$_[0]}:
  ()
}refs@_}

sub wday{(int(365.25*($_[2]-($_[1]<3)))+int(30.6*(1+$_[1]+12*($_[1]<3)))+$_[0]-621050)%7+1}
sub leap{$_[0]%4?0:$_[0]%100?1:$_[0]%400?0:1}
sub days{(31,(28+leap $_[1]),(31,30,31,30,31)x2)[$_[0]-1]}
sub cal{by 7,((undef)x(wday(1,@_)-1),1..days @_)}

sub all{@_==grep$_,@_}
sub one{1==grep$_,@_}
sub none{!grep$_,@_}
sub any{!&none}

sub import{no strict 'refs';*{caller(0)."::$_"}=${"$_[0]::"}{$_} for grep !/^(BEGIN|__ANON__|a|import)$/, keys%{"$_[0]::"}}



package www;
use strict;
use qxp;
use config;
use L2;
#use encoding 'utf8';
my $utf8=0;

sub import{no strict 'refs';do{*{caller(0)."::$_"}=${"$_[0]::"}{$_}} for qw'template html depercent';} # out! out!

my %template;
sub template;
#require tags;
*template=templator{copy $template{$_[0]}||=slurp "$path::templates/$_[0].htm"}
#    '<#','#>' => sub{package tags;eval$_[0]},
    '${','}'  => sub{$_[1]{$_[0]}},
    '<@','@>' => sub{template $_[0]},
    '<^','^>' => sub{$^{$_[0]}}
;

sub html;
*html=subst
    '&'=>'&amp;',
    '<'=>'&lt;'
;

sub depercent{map{s/%([\dA-Fa-f]{2})/pack 'C',hex $1/ge;utf8::decode $_ if $utf8;$_}@_}

sub ok{print template 'index'}

sub rf{
  $_[0]{url}||=$ENV{HTTP_REFERER};
  $_[0]{time}||=0;
  print template 'refresh',$_[0];
}

$ENV{PERL}=$];
$ENV{URL}=s,^/,,?[grep!/\W/,split'/']:[] for copy $ENV{REDIRECT_URL};
$ENV{QUERY}={depercent split/&|=/,$ENV{QUERY_STRING}};
$ENV{POST}={depercent split/&|=/,do{read STDIN, my $x, $ENV{CONTENT_LENGTH};$x}} if $ENV{REQUEST_METHOD} eq 'POST' and $ENV{CONTENT_TYPE} =~ '^application/';
$ENV{COOKIE}={split/; |=/,$ENV{HTTP_COOKIE}};

666;





Это сообщение отредактировал(а) gcc - 22.10.2009, 06:03
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 22.10.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(Logo @  21.10.2009,  22:15 Найти цитируемый пост)
Этот модуль только для методов работает, для отдельных sub нет?

Нет

Цитата(Logo @  21.10.2009,  22:15 Найти цитируемый пост)
А как же он тогда работает smile?

black hairy magic

Это сообщение отредактировал(а) KSURi - 22.10.2009, 09:21


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Logo
Дата 22.10.2009, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Ага, чуть со стула не упал, когда выдало
Код

While this module does rely on the hairy black magic of Devel::Declare it does not depend on a source filter.
-> Promt ->
В то время как этот модуль действительно полагается на волосатую черную магию Devel::Declare, это не зависит от исходного фильтра.

 smile  smile  smile 


А как бы это, по понятней?
PM MAIL   Вверх
KSURi
Дата 22.10.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



http://www.catalyzed.org/2009/05/dawn-of-a...rls-syntax.html
Там описан общий подход.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 24.3.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



кстате, тут http://blogs.perl.org/users/aevar_arnfjor_...eally-slow.html написано что этот модуль MooseX::Method::Signatures замедляет работу при выпонении, это так? там не написано правда где тестировали mod_perl или нет?
PM WWW ICQ Skype GTalk Jabber   Вверх
mvsgt
Дата 27.3.2010, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



MooseX:smile близок к тому что нужно, но пользоваться им...

Вообще для программирования на перл не "для себя" надо установить порог потребностей, начиная с которого переходить на другие языки. Того что над ТС - в перле нет. Есть в Java, C++ и так далее. Не так они страшны как кажется.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0984 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.