На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Внимательно изучите правила раздела перед созданием темы
0. ПРИЛАГАЙТЕ СВОИ СКРИПТЫ.
1. Прежде чем создать топик, используйте поиск. Возможно это уже обсуждалось.
2. В топике указывайте ОС, режим работы скрипта (CLI|CGI). Очень желателен вывод лог-файлов и того места, куда у вас назначен вывод данных (STDOUT|STDERR)
3. Помните: вы знаете что вы хотите, а форумчане - нет. Поэтому следуйте простому правилу: грамотный развернутый вопрос - грамотный развернутый ответ.
Модераторы: ANDLL
  
    > Атрибуты для подпрограмм. Пре-вычисления , Perl v5.26x
      Хочу чтобы всегда в методах получать данные в виде HASH, раскодированные из формата JSON.
      Кода:
      ExpandedWrap disabled
        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` данные:
      ExpandedWrap disabled
        $VAR1 = [
                  'main',
                  \*::z,
                  sub { "DUMMY" },
                  'json_input',
                  undef,
                  'CHECK',
                  'C:\\dev\\parser\\1.pl',
                  12
                ];


      Для больше понятности, ищу в декораторе\атрибуте переданные в main::z данные
      ```
      {
      "a" : "b"
      }
      ```

      Где их искать в декораторе\атрибуте?
        ExpandedWrap disabled
          #!/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
          };
          Цитата Gonarh @

          Негодицца.
          Интересуют атрибуты подпрограмм. Вроде обёрток для методов или подпрограмм.
          Допустим, есть класс с методами (или много классов). В метод передаётся строка с валидным JSON. Метод\подпрограмма должна на входе прозрачно получать не строку, а обработанный JSON. Допустим, в виде HASH.

          Иллюстрация (не код для существующей машины):
          ExpandedWrap disabled
            `{ "a" : " b" }` -> fn( $x ):json_input -> $x содержит не строку, а распрасенный JSON из строки
            Передавай тогда не строку а скаляр-указатель на уже подготовленный хэш. А то ты странное хочешь, передать строку а оно само пещельбе-мещельбестало хэшем
            Сообщение отредактировано: Gonarh -
              Цитата Gonarh @
              Передавай тогда не строку а скаляр-указатель на уже подготовленный хэш. А то ты странное хочешь, передать строку а оно само пещельбе-мещельбестало хэшем

              Во, блин.
              Задача не в этом.

              Есть куча классов, расположенных на одном уровне вложенности. Допустим, контроллер (вопрос не про готовое).
              Вот, на каждый метод можно навешать собак (атрибуты), чтобы они проверяли, форматировали и контролировали: ```sub x:a:b:c:d:e```. Допустим, проверка доступа или логгирование при вызове каждого метода.
              Вот, нужно из метода-атрибута как-то разобрать, какие данные получает основной метод (на который навешаны собаки А, БЭ, ЦЭ и т.д.).
              Я, для намёка, привёл код в начале.
              Сообщение отредактировано: Tishaishii -
                Либо я не догоняю, либо одно из двух. Щяс засуммоню исчо одного перловика, Majestio мож ты понял шо человек хочет.
                  Цитата Gonarh @
                  Либо я не догоняю, либо одно из двух. Щяс засуммоню исчо одного перловика, Majestio мож ты понял шо человек хочет.

                  ТС желает работать с системой атрибутов в Perl. Почитать можно тут. Я спецом не ввязываюсь в этот чятик, так как не считаю это полезным. Чисто ИМХО - хотели сделать "программный сахар", но почему-то получился "крахмал" :lol: Лично мне вполне предостаточно BEGIN и END для модулей, а все остальное, которое модифицирует привычный порядок исполнения - от лукавого. Повторюсь - ИМХО.
                    Цитата Majestio @
                    Цитата Gonarh @
                    Либо я не догоняю, либо одно из двух. Щяс засуммоню исчо одного перловика, Majestio мож ты понял шо человек хочет.

                    ТС желает работать с системой атрибутов в Perl. Почитать можно тут. Я спецом не ввязываюсь в этот чятик, так как не считаю это полезным. Чисто ИМХО - хотели сделать "программный сахар", но почему-то получился "крахмал" :lol: Лично мне вполне предостаточно BEGIN и END для модулей, а все остальное, которое модифицирует привычный порядок исполнения - от лукавого. Повторюсь - ИМХО.

                    Сахар...
                    Ну и как с помощью BEGIN и END создать полноценный декоратор для ООП? Аля "@" в Python?
                      Цитата Tishaishii @
                      Сахар...
                      Ну и как с помощью BEGIN и END создать полноценный декоратор для ООП? Аля "@" в Python?

                      Я практически не пользуюсь средствами ООП на Перле. Мне это не нужно. Если мне ну очень захочется ООП - я возьму Руби, благо тоже замечательный ЯП а Питон не перевариваю.
                        Дублирую вопрос. Хочу для нужных методов, которые подпрограммы, некоторые аргументы получать, раскодированные с помощью ... или обработанные как-то.
                        Каждый раз в каждом классе и его методах дополнительно писать my $data = ... decode( $arg ) - не интересно.
                        Гораздо удобнее навешивать декораторы на метод.
                        Стараюсь реализовать систему декораторов в Perl v5x. Только не знаю как получить аргументы к методу в декораторе.
                        Пример для проб:
                        ExpandedWrap disabled
                          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"
                          }


                        Может быть, пример должен выглядеть по-другому.
                          Цитата Tishaishii @
                          Хочу для нужных методов, которые подпрограммы, некоторые аргументы получать, раскодированные с помощью ... или обработанные как-то.

                          В принципе с этим вопросом можно поиграться ... Но будь добр, расскажи как ты планируешь обрабатывать ошибки в этих "пред-вычислениях", если не дай-то Ктулху, туда прилетит "битая" JSON-строка?
                            Цитата Majestio @

                            Пока вы упирались от решения, я подобрал нужную комбинацию символов для создания нужно программы. Дарю:
                            ExpandedWrap disabled
                              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
                            Сообщение отредактировано: Tishaishii -
                              Цитата Tishaishii @
                              Пока вы упирались от решения, я подобрал нужную комбинацию символов для создания нужно программы. Дарю:

                              Спасибо. Но я тоже дублирую вопрос - что на счет обработки ошибок?
                                Цитата Majestio @
                                Цитата Tishaishii @
                                Пока вы упирались от решения, я подобрал нужную комбинацию символов для создания нужно программы. Дарю:

                                Спасибо. Но я тоже дублирую вопрос - что на счет обработки ошибок?

                                Что на счёт обработка ошибок?
                                try-catch? Это отдельный вопрос.

                                По текущему вопросу сейчас запостю исправления в посте на счёт уточнения правильности указания индексов в `json_input`.

                                А про try-catch - что-то-там есть уже.

                                Добавлено
                                Цитата Majestio @

                                Если имеется обработка ошибок в моём коде - так идея полностью описана. Добавляйте любые вызовы, замените громоздкие блоки на вызовы внешних методов\функций. В общем, я только хотел получить поддержку, а не разработать и заниматься этим ПО.

                                Это только кусочек для моей задачи. Хотя можно было обойтись без него.

                                Добавлено
                                Вона. `eval {} or eval {} or die`
                                  Да не, нунах .... чел чисто прикалывается.
                                  Конкретный идиот, который в Перле прочитал два абзаца документации!!!
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0469 ]   [ 15 queries used ]   [ Generated: 26.04.24, 14:10 GMT ]