Как на Перл будет выглядеть выражение (желательно на том Перле, который можно библиотекой подключить к проекту на C или Asm), которое распарсит строку с параметрами командной строки типа ... /xxx file1 file2 в три строковых переменные, причем если слова file1 или file2 в кавычках, то в переменные она их засунет без кавычек. Собираю свой скриптовый язык, и вот думаю не перемудрил ли с синтаксисом: Код (Text): %s_0 %is(%#novzt'"','"' %s_1)%err(%jp(,netx %s_1))%next%jp(tx)%is(%#novzt'"','"' %s_2)%err(%jp(,netx %s_2)) Хотелось бы увидеть, как это выглядит на других языках.
То, что тебе надо, называется "регулярные выражения". Вид их примерно такой: \/(\S+)\s+\"?(\S+)\"?\s+\"?(\S+)\"? По шагам: \/ - слеш (\S+) - 1 или более непробелов. В скобках, чтобы потом извлечь совпадение. \s+ - 1 или более пробелов. \" - кавычки. \"? - кавычек может и не быть. Хотя для командной строки имхо проще использовать гнушный getopt().
параметры командной строки (в C во всяком случае) передаются как `char *argv[]'. И, для каждого i, argv это один аргумент. без всякого лишнего гимора. В perl, bash, python, java и прочих мне известных языках параметры передаются по тому же принципу (ну или их можно получить в таком виде).
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" и т.д. Надо соответственно распарсить в три переменных. Вот мне и интересно, как это будет выглядеть на разных языках, на моих закорючках работает, пример выше.
Avalonec Да, об этом не подумал. Тогда наверное так: \/(\S+)\s+((\"[^\"]*\")|(\S+))\s+((\"[^\"]*\")|(\S+)) P.S. в 2000 и выше есть CommandLineToArgvW.
yureckor Про регэкспы можно почитать: perlrequick, perlre это вроде как негласный (?) стандарт, они даже в бейсике такие же. imho что-то своё выдумывать смысла мало. Вот так вроде бы можно выделить все ключи и имена файлов: Код (Text): @a = ( "/xxx -yyy file1.txt file2.txt", "/xxx \"C:\\Program Files\\file1.txt\" file2.txt", "/xxx file1.txt \"C:\\Program Files\\file2.txt\"", ); foreach (@a) { print "\n$_\n"; $_ = " $_"; @keys = /\s+[\/-](\S+)/g; foreach (@keys) { print "key: `$_'\n"; } @files = /[\s]+(\"[^\/\"<>]+\"|[^-|\/]\S+)/g; foreach (@files) { print "file: `$_'\n"; } } Результат: /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"' ЗЫ: Сильно не пинайте, я пёрл не знаю =)
S_T_A_S_ >что-то своё выдумывать смысла мало Немного истории: есть виндовая wsprintf. Она понятно дело убогая, сделали свою. Возникла мысль- надо сделать обратную- из текста в переменные. Сделали. Стал парсить что-то более сложное, чем ini файлы и http заголовки, решили добавить разных команд для облегчения работы. Потом мысль поперла, вышел скриптовый язык Сейчас тестирую. Так что все уже сделано и применяется. Dll думаю уложится в 16kb. Да и потом я не конкурент Перл'у или Питону сделал, а специализированный скрипт. Так что все ок.
yureckor А если аргумент включает кавычки, то что получится как? Чтоб не казалось надуманным вот пример (в *nix работает), ищем все строки-литералы в *c файлах текущей директории: grep -en '"[^"]*"' *c PS Это я просто для "повышения образованности".
rgo Код (Text): %jp('"','"' %msg)%repeat будет выводить MessageBox. Но этот код парсит подгруженный в память файл. Никакой работы с директориями и пр. нет и скорей всего не будет; sctx (это название) для встройки в основную программу предназначается.