как на Перл будет выглядеть выражение?

Тема в разделе "WASM.HEAP", создана пользователем yureckor, 1 авг 2005.

  1. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Как на Перл будет выглядеть выражение (желательно на том Перле, который можно библиотекой подключить к проекту на C или Asm), которое распарсит строку с параметрами командной строки типа ... /xxx file1 file2

    в три строковых переменные, причем если слова file1 или file2 в кавычках, то в переменные она их засунет без кавычек.



    Собираю свой скриптовый язык, и вот думаю не перемудрил ли с синтаксисом:
    Код (Text):
    1. %s_0 %is(%#novzt'"','"' %s_1)%err(%jp(,netx %s_1))%next%jp(tx)%is(%#novzt'"','"' %s_2)%err(%jp(,netx %s_2))


    Хотелось бы увидеть, как это выглядит на других языках.
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    То, что тебе надо, называется "регулярные выражения". Вид их примерно такой:

    \/(\S+)\s+\"?(\S+)\"?\s+\"?(\S+)\"?

    По шагам:

    \/ - слеш

    (\S+) - 1 или более непробелов. В скобках, чтобы потом извлечь совпадение.

    \s+ - 1 или более пробелов.

    \" - кавычки.

    \"? - кавычек может и не быть.



    Хотя для командной строки имхо проще использовать гнушный getopt().
     
  3. Avalonec

    Avalonec New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    111
    Адрес:
    Тула
    reverser

    А как же пробелы внутри командной строки? например, C:\Program Files?
     
  4. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    параметры командной строки (в C во всяком случае) передаются как `char *argv[]'. И, для каждого i, argv это один аргумент. без всякого лишнего гимора. В perl, bash, python, java и прочих мне известных языках параметры передаются по тому же принципу (ну или их можно получить в таком виде).
     
  5. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    rgo

    В проге на асме командная строка берется GetCommandLine.

    Для данного случая она может выглядеть (после вырезки самого "C:\...\prog.exe")

    /xxx file1.txt file2.txt

    или

    /xxx "C:\Program Files\file1.txt" file2.txt

    или

    /xxx file1.txt "C:\Program Files\file2.txt"

    и т.д.

    Надо соответственно распарсить в три переменных.



    Вот мне и интересно, как это будет выглядеть на разных языках, на моих закорючках работает, пример выше.
     
  6. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Avalonec



    Да, об этом не подумал. Тогда наверное так:

    \/(\S+)\s+((\"[^\"]*\")|(\S+))\s+((\"[^\"]*\")|(\S+))



    P.S. в 2000 и выше есть CommandLineToArgvW.
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    yureckor



    Про регэкспы можно почитать: perlrequick, perlre



    это вроде как негласный (?) стандарт, они даже в бейсике такие же.

    imho что-то своё выдумывать смысла мало.



    Вот так вроде бы можно выделить все ключи и имена файлов:
    Код (Text):
    1. @a = (  "/xxx -yyy file1.txt file2.txt",
    2.         "/xxx \"C:\\Program Files\\file1.txt\" file2.txt",
    3.         "/xxx file1.txt \"C:\\Program Files\\file2.txt\"",
    4.     );
    5.  
    6. foreach (@a) {
    7.  
    8.     print "\n$_\n";
    9.     $_ = " $_";
    10.  
    11.     @keys = /\s+[\/-](\S+)/g;
    12.     foreach (@keys) { print "key: `$_'\n"; }
    13.  
    14.     @files = /[\s]+(\"[^\/\"<>]+\"|[^-|\/]\S+)/g;
    15.     foreach (@files) { print "file: `$_'\n"; }
    16. }
    17.  
    Результат:



    /xxx -yyy file1.txt file2.txt

    key: `xxx'

    key: `yyy'

    file: `file1.txt'

    file: `file2.txt'



    /xxx "C:\Program Files\file1.txt" file2.txt

    key: `xxx'

    file: `"C:\Program Files\file1.txt"'

    file: `file2.txt'



    /xxx file1.txt "C:\Program Files\file2.txt"

    key: `xxx'

    file: `file1.txt'

    file: `"C:\Program Files\file2.txt"'



    ЗЫ: Сильно не пинайте, я пёрл не знаю =)
     
  8. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    S_T_A_S_

    >что-то своё выдумывать смысла мало

    Немного истории: есть виндовая wsprintf. Она понятно дело убогая, сделали свою. Возникла мысль- надо сделать обратную- из текста в переменные. Сделали. Стал парсить что-то более сложное, чем ini файлы и http заголовки, решили добавить разных команд для облегчения работы. Потом мысль поперла, вышел скриптовый язык :) Сейчас тестирую. Так что все уже сделано и применяется. Dll думаю уложится в 16kb.



    Да и потом я не конкурент Перл'у или Питону сделал, а специализированный скрипт. Так что все ок.
     
  9. rgo

    rgo New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2005
    Сообщения:
    87
    yureckor

    А если аргумент включает кавычки, то что получится как? Чтоб не казалось надуманным вот пример (в *nix работает), ищем все строки-литералы в *c файлах текущей директории:



    grep -en '"[^"]*"' *c



    PS Это я просто для "повышения образованности".
     
  10. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    rgo
    Код (Text):
    1. %jp('"','"' %msg)%repeat


    будет выводить MessageBox. Но этот код парсит подгруженный в память файл. Никакой работы с директориями и пр. нет и скорей всего не будет; sctx (это название) для встройки в основную программу предназначается.