Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.236.86.184] |
|
Сообщ.
#1
,
|
|
|
Хочу чтобы всегда в методах получать данные в виде HASH, раскодированные из формата JSON.
Кода: use Attribute::Handlers ; use Data::Dumper ; use JSON ; my $json = JSON->new( )->utf8( 0 ) ; sub json_input( $\*&\@\@$$$ ):ATTR { my ( $package , $symbol, $referent, $attr , $data, $phase, $filename, $linenum ) = @_ ; # Here I expected to catch a string $json_data from z print( &Dumper( \@_ ) ) ; } sub z( $$ ):json_input { my ( undef( ) , $json_data ) = @_ ; } __PACKAGE__->z( << '.' ) { "a" : "b" } Только, запускаю код и не вижу переданные в метод `main::z` данные: $VAR1 = [ 'main', \*::z, sub { "DUMMY" }, 'json_input', undef, 'CHECK', 'C:\\dev\\parser\\1.pl', 12 ]; Для больше понятности, ищу в декораторе\атрибуте переданные в main::z данные ``` { "a" : "b" } ``` Где их искать в декораторе\атрибуте? |
Сообщ.
#2
,
|
|
|
#!/usr/bin/perl use JSON; use Data::Dumper; $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; $text = decode_json($json); print Dumper($text); $VAR1 = { 'e' => 5, 'c' => 3, 'a' => 1, 'b' => 2, 'd' => 4 }; |
Сообщ.
#3
,
|
|
|
Цитата Gonarh @ Негодицца. Интересуют атрибуты подпрограмм. Вроде обёрток для методов или подпрограмм. Допустим, есть класс с методами (или много классов). В метод передаётся строка с валидным JSON. Метод\подпрограмма должна на входе прозрачно получать не строку, а обработанный JSON. Допустим, в виде HASH. Иллюстрация (не код для существующей машины): `{ "a" : " b" }` -> fn( $x ):json_input -> $x содержит не строку, а распрасенный JSON из строки |
Сообщ.
#4
,
|
|
|
Передавай тогда не строку а скаляр-указатель на уже подготовленный хэш. А то ты странное хочешь, передать строку а оно само
|
Сообщ.
#5
,
|
|
|
Цитата Gonarh @ Передавай тогда не строку а скаляр-указатель на уже подготовленный хэш. А то ты странное хочешь, передать строку а оно само Во, блин. Задача не в этом. Есть куча классов, расположенных на одном уровне вложенности. Допустим, контроллер (вопрос не про готовое). Вот, на каждый метод можно навешать собак (атрибуты), чтобы они проверяли, форматировали и контролировали: ```sub x:a:b:c:d:e```. Допустим, проверка доступа или логгирование при вызове каждого метода. Вот, нужно из метода-атрибута как-то разобрать, какие данные получает основной метод (на который навешаны собаки А, БЭ, ЦЭ и т.д.). Я, для намёка, привёл код в начале. |
Сообщ.
#6
,
|
|
|
Либо я не догоняю, либо одно из двух. Щяс засуммоню исчо одного перловика, Majestio мож ты понял шо человек хочет.
|
Сообщ.
#7
,
|
|
|
Цитата Gonarh @ Либо я не догоняю, либо одно из двух. Щяс засуммоню исчо одного перловика, Majestio мож ты понял шо человек хочет. ТС желает работать с системой атрибутов в Perl. Почитать можно тут. Я спецом не ввязываюсь в этот чятик, так как не считаю это полезным. Чисто ИМХО - хотели сделать "программный сахар", но почему-то получился "крахмал" Лично мне вполне предостаточно BEGIN и END для модулей, а все остальное, которое модифицирует привычный порядок исполнения - от лукавого. Повторюсь - ИМХО. |
Сообщ.
#8
,
|
|
|
Цитата Majestio @ Цитата Gonarh @ Либо я не догоняю, либо одно из двух. Щяс засуммоню исчо одного перловика, Majestio мож ты понял шо человек хочет. ТС желает работать с системой атрибутов в Perl. Почитать можно тут. Я спецом не ввязываюсь в этот чятик, так как не считаю это полезным. Чисто ИМХО - хотели сделать "программный сахар", но почему-то получился "крахмал" Лично мне вполне предостаточно BEGIN и END для модулей, а все остальное, которое модифицирует привычный порядок исполнения - от лукавого. Повторюсь - ИМХО. Сахар... Ну и как с помощью BEGIN и END создать полноценный декоратор для ООП? Аля "@" в Python? |
Сообщ.
#9
,
|
|
|
Цитата Tishaishii @ Сахар... Ну и как с помощью BEGIN и END создать полноценный декоратор для ООП? Аля "@" в Python? Я практически не пользуюсь средствами ООП на Перле. Мне это не нужно. Если мне ну очень захочется ООП - я возьму Руби, благо тоже замечательный ЯП |
Сообщ.
#10
,
|
|
|
Дублирую вопрос. Хочу для нужных методов, которые подпрограммы, некоторые аргументы получать, раскодированные с помощью ... или обработанные как-то.
Каждый раз в каждом классе и его методах дополнительно писать my $data = ... decode( $arg ) - не интересно. Гораздо удобнее навешивать декораторы на метод. Стараюсь реализовать систему декораторов в Perl v5x. Только не знаю как получить аргументы к методу в декораторе. Пример для проб: use Attribute::Handlers ; use Data::Dumper ; use JSON ; my $json = JSON->new( )->utf8( 0 ) ; sub json_input( $\*&\@\@$$$ ):ATTR { my ( $package , $symbol, $referent, $attr , $data, $phase, $filename, $linenum ) = @_ ; # Here I expected to catch a string $json_data from z print( &Dumper( \@_ ) ) ; } sub z( $$ ):json_input { my ( undef( ) , $json_data ) = @_ ; } __PACKAGE__->z( << '.' ) { "a" : "b" } Может быть, пример должен выглядеть по-другому. |
Сообщ.
#11
,
|
|
|
Цитата Tishaishii @ Хочу для нужных методов, которые подпрограммы, некоторые аргументы получать, раскодированные с помощью ... или обработанные как-то. В принципе с этим вопросом можно поиграться ... Но будь добр, расскажи как ты планируешь обрабатывать ошибки в этих "пред-вычислениях", если не дай-то Ктулху, туда прилетит "битая" JSON-строка? |
Сообщ.
#12
,
|
|
|
Цитата Majestio @ Пока вы упирались от решения, я подобрал нужную комбинацию символов для создания нужно программы. Дарю: use Attribute::Handlers ; use JSON ; my $json = JSON->new( )->utf8( 0 ) ; sub json_input:ATTR { my ( undef( ) , $symbol, $referent , undef( ) , $data ) = @_ ; $data ||= [ 0 ] ; *$symbol = sub { return $referent->( @_ ) unless @_ > 1 ; my ( $self , @args ) = @_ ; my @idxs = keys ( %{ { + map { do { if ( $_ >= 0 ) { $_ } else { @args + $_ } } => undef( ) , } grep { ( abs( $_ ) >=0 ) && ( abs( $_ ) < @args ) } @$data } } ) ; $_ = $json->decode( $_ ) foreach grep { defined( $_ ) } @args[ @idxs ] ; $referent->( $self , @args ) } } sub json_output:ATTR { my ( undef( ) , $symbol, $referent ) = @_ ; *$symbol = sub { my @data = $referent->( @_ ) ; $json->encode( @data > 1 ? \@data : @data ) } } sub test :json_input( 0 , 2 , 10 ) # позиции аргументов, которые нужно раскодировать перед применением :json_output { my ( $self , $data0 , $data1 , $data2 ) = @_ ; $data0->{ 'a' } , $data2->{ 'x' } } print( __PACKAGE__->test( << '.' , << '.' , << '.' ) ) ; # many string arguments { "a" : { "b" : "d" } , "c" : "d" } . { "d" : { "e" : "r" } , "c" : "d" } . { "x" : { "e" : "r" } , "c" : "d" } . +1 |
Сообщ.
#13
,
|
|
|
Цитата Tishaishii @ Пока вы упирались от решения, я подобрал нужную комбинацию символов для создания нужно программы. Дарю: Спасибо. Но я тоже дублирую вопрос - что на счет обработки ошибок? |
Сообщ.
#14
,
|
|
|
Цитата Majestio @ Цитата Tishaishii @ Пока вы упирались от решения, я подобрал нужную комбинацию символов для создания нужно программы. Дарю: Спасибо. Но я тоже дублирую вопрос - что на счет обработки ошибок? Что на счёт обработка ошибок? try-catch? Это отдельный вопрос. По текущему вопросу сейчас запостю исправления в посте на счёт уточнения правильности указания индексов в `json_input`. А про try-catch - что-то-там есть уже. Добавлено Цитата Majestio @ Если имеется обработка ошибок в моём коде - так идея полностью описана. Добавляйте любые вызовы, замените громоздкие блоки на вызовы внешних методов\функций. В общем, я только хотел получить поддержку, а не разработать и заниматься этим ПО. Это только кусочек для моей задачи. Хотя можно было обойтись без него. Добавлено Вона. `eval {} or eval {} or die` |
Сообщ.
#15
,
|
|
|
Да не, нунах .... чел чисто прикалывается.
Конкретный идиот, который в Перле прочитал два абзаца документации!!! |