Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Alan Long                            2:5030/1082.72 31 Jul 2003  01:06:08
 To : Andrey Sapozhnikov
 Subject : Term::Readline and CLI
 -------------------------------------------------------------------------------- 
 
 * Originally from Andrey Sapozhnikov (2:5020/400) to Alan Long.
 
  AS> From: Andrey Sapozhnikov <sapa@icb.chel.su>
 
 [...]
 
  AS> Hу примерно так... функции lccompl и defcompl задел на будущее,
  AS> когда надумается кроме ключевых слов completion для имен и т.д.
  AS> вводить. uccompl подставляется вместо (точнее - как враппер, перед)
  AS> стандартной $attribs->{list_completion_function} для
  AS> регистронезависимого дополнения. $buffer и связаные с ним
  AS> манипуляции нужны для накопления незавершеной команды состоящей из
  AS> нескольких строк. В данном случае я сделал sql-like стиль. Т.е.
  AS> команда не завершена пока нет ; в конце. Можно легко переделать
  AS> на shell-style или выкинуть весь этот механизм вообще. Тогда все,
  AS> что вернет $term->readline будет считаться командой от начала и до
  AS> конца.
 
  AS> ======================== вот оно ============================
  AS> #!/usr/bin/perl -w
  AS> use strict;
  AS> use Term::ReadLine;
 
  AS> my $term = new Term::ReadLine 'myinterface';
  AS> my $attribs = $term->Attribs;
 
  AS> my $buffer = '';
  AS> #my $start_compl = ['ADD', 'DELETE', 'MODIFY'];
  AS> my $start_compl = [qw(ADD DELETE MODIFY)];
  AS> my $add_compl = ['USER', 'GROUP', 'SERVER'];
  AS> my $add_compl_user = ['NAME', 'LAST', 'UID', 'PASSWORD', 'EMAIL',  
  AS>    'PHONE', 'DESCRIPTION'];
 
  AS> sub uccompl { $attribs->{list_completion_function}->(uc shift, @_)
  AS> } sub lccompl { $attribs->{list_completion_function}->(lc shift,
  AS> @_) } sub defcompl { $attribs->{list_completion_function}->(@_) }
  AS> $attribs->{completion_word} = [];
  AS> $attribs->{completion_entry_function} = \&uccompl;
 
  AS> $attribs->{attempted_completion_function} = sub {
  AS>      my ($text, $line, $start, $end) = @_;
  AS>      my $fline = $buffer . substr($line, 0, $start);
  AS>      $attribs->{completion_entry_function} = \&uccompl;
 
  AS>      if ($fline =~ /^\s*$/) {
  AS>          $attribs->{completion_word} = $start_compl;
  AS>      } elsif ($fline =~ /^\s*ADD\s+$/i) {
  AS>          $attribs->{completion_word} = $add_compl;
  AS>      } elsif ($fline =~ /^\s*ADD\s+USER\s+$/i) {
  AS>          $attribs->{completion_word} = $add_compl_user;
  AS>      } elsif ($fline =~ /^\s*ADD\s+USER\s+(\S.*)$/i) {
  AS>          my $tail = $1;
  AS>          my @pairs = $tail =~ /([^\s"]+|"(?:[^"\\]|\\.)*")\s+/g;   
  AS>       if (scalar(@pairs) % 2 == 0) {
  AS>              my %pairs = map uc, @pairs;
  AS>              my @rest = grep {!exists $pairs{$_}} @$add_compl_user;
  AS>              $attribs->{completion_word} = \@rest;
  AS>          } else {
  AS>              $attribs->{completion_word} = [];
  AS>          }
  AS>      } else {
  AS>          $attribs->{completion_word} = [];
  AS>      }
  AS>      return ();
  AS> };
 
  AS> while (defined ($_ = $term->readline($buffer ? 'prompt+ ' :
  AS> 'prompt> '))) {      $buffer .= $_;
  AS>      unless ($buffer =~ /;\s*$/) {
  AS>          $buffer .= ' ' if length($buffer);
  AS>          next;
  AS>      }
  AS>      $buffer =~ s/;\s*$//;
 
  AS>      print "Processing $buffer\n";
  AS>      $buffer = '';
  AS> }
  AS> ======================== конец ==========================
 
 В принципе у меня что-то подобное написанно, для нескольких команд достаточно
 удобно, но если дерево команд достаточно большое, то ... В принципе я спрашивал 
 про готовые наработки в этой области дабы не изобретать велосипед, так весь
 синтаксис команд хотелось-бы описать как-нибудь так:
 
 $commands = {
    add => {
       user => {
          name => 'value',
          last => 'value',
          uid => 'value',
          password => 'value',
          email => 'value',
          phone => 'value',
       },
       group => {
       }
    },
    remove => {
       user => 'list',
       group => 'list',
    },
    config => {
       ldap => {
          server => 'value',
          base => 'value',
          bind => 'value',
          password => 'value',
       }
    }
 }; 
 
 Hу а раз нету готвого - пошел изобретать велосипед, хотя тут где-то в гугле
 видел SQL-клиент написанный на perl+readline, нужно будет посмотреть может-быть 
 там что-нибудь полезное для себя найду...
 
 Так-же интересуют продукты на perl использующие readline, и написанные неплохо
 где можно всему этому (созданию CLI) поучится, пока изучаю psh (или как он
 называется perl shell) из комплекта поставки Term::Readline::GNU.
 
  AS> Андрей
 
 -- 
 With best,
      Ъ-·    Ъ
      Е-ЧLaі\і <alan@x-rays.eu.org>
 
 --- timEd/386 1.10+
  * Origin: X - Rays Station (2:5030/1082.72)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Term::Readline and CLI   Alan Long   29 Jul 2003 07:49:27 
 Re: Term::Readline and CLI   Andrey Sapozhnikov   29 Jul 2003 18:14:26 
 Term::Readline and CLI   Alan Long   31 Jul 2003 01:06:08 
 Term::Readline and CLI   Alan Long   06 Aug 2003 08:22:58 
Архивное /ru.perl/4581f2833351.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional