std.getopt
Обработка параметров командной строки.
Модуль getopt реализует функцию getopt, которая соответствует синтаксису параметров командной строки POSIX. Поддерживаются расширения GNU в виде длинных параметров, вводимых с помощью двойного дефиса ("--"). Поддержка объединения параметров командной строки, как это было в случае с более традиционным подходом с однобуквенными параметрами, предоставляется, но по умолчанию не включена.
- Лицензия:
- Лицензия Boost 1.0.
- Авторы:
- Андрей Александреску
- Уведомление
- Этот модуль и его документация вдохновлены модулем Perl's Getopt::Long. Синтаксис D's
getoptпроще, чем его аналог в Perl, потому чтоgetoptвыводит ожидаемые типы параметров из статических типов переданных указателей.
- Исходный код
- std/getopt.d
- класс GetOptException: object.Exception;
-
Выбрасывается при одном из следующих условий:
- Передается нераспознанный аргумент командной строки, и
std.getopt.config.passThroughотсутствовал. - Параметр командной строки не найден, и
std.getopt.config.requiredбыл указан.
- Передается нераспознанный аргумент командной строки, и
- GetoptResult getopt(T...)(ref string[] args, T opts);
-
Парсинг и удаление параметров командной строки из массива строк.
- Синопсис
import std.getopt; string data = "file.dat"; int length = 24; bool verbose; enum Color { no, yes }; Color color; void main(string[] args) { auto helpInformation = getopt( args, "length", &length, // numeric "file", &data, // string "verbose", &verbose, // flag "color", "Information about this color", &color); // enum ... if (helpInformation.helpWanted) { defaultGetoptPrinter("Some information about the program.", helpInformation.options); } }Функцияgetoptпринимает ссылку на командную строку (полученнуюmain) в качестве первого аргумента и неограниченное количество пар строк и указателей. Каждая строка — это параметр, предназначенный для "заполнения" значения, на которое указывает указатель справа (указатель "связи"). Строка параметра в вызовеgetoptне должна начинаться с дефиса. Во всех случаях параметры командной строки, которые были обработаны и использованыgetopt, удаляются изargs. Всё, что в аргументах не выглядело как параметр, остается вargsдля дальнейшей обработки программой. Значения, на которые параметры не повлияли, не трогаются, поэтому распространённым приёмом является инициализация параметров их значениями по умолчанию, а затем вызовgetopt. Если аргумент командной строки распознаётся как параметр с параметром, и параметр не может быть правильно обработано (например, ожидается число, но его нет), выбрасывается исключениеConvException. Еслиstd.getopt.config.passThroughне был переданgetopt, и найден нераспознанный аргумент командной строки, выбрасываетсяGetOptException. В зависимости от типа связываемого указателя,getoptраспознаёт следующие типы параметров:-
Булевы параметры. Одиночный аргумент устанавливает параметр в
true. Дополнительно, true или false можно задать внутри параметра, разделив их знаком "=":bool verbose = false, debugging = true; getopt(args, "verbose", &verbose, "debug", &debugging);
Для установкиverboseвtrue, вызовите программу с--verboseили--verbose=true. Для установкиdebuggingвfalse, вызовите программу с--debugging=false. -
Числовые параметры. Если параметр связан с числовым типом, ожидается число как следующий параметр или прямо внутри параметра, разделённое знаком "=":
uint timeout; getopt(args, "timeout", &timeout);
Для установкиtimeoutв5, вызовите программу с--timeout=5или--timeout 5. -
Инкрементные параметры. Если имя параметра имеет суффикс "+" и связан с числовым типом, то значение параметра отслеживает количество раз, когда этот параметр встречался в командной строке:
uint paranoid; getopt(args, "paranoid+", ¶noid);
Вызов программы с "--paranoid --paranoid --paranoid" установитparanoidв 3. Обратите внимание, что инкрементный параметр никогда не ожидает параметра, например, в командной строке "--paranoid 42 --paranoid" "42" не установитparanoidв 42; вместо этогоparanoidустанавливается в 2, и "42" не рассматривается как часть обычных аргументов программы. -
Параметры перечисления. Если параметр связан с перечислением, ожидается символ перечисления как строка как следующий параметр или прямо внутри параметра, разделённое знаком "=":
enum Color { no, yes }; Color color; // default initialized to Color.no getopt(args, "color", &color);Для установкиcolorвColor.yes, вызовите программу с--color=yesили--color yes. -
Строковые параметры. Если параметр связан со строкой, ожидается строка как следующий параметр или прямо внутри параметра, разделённое знаком "=":
string outputFile; getopt(args, "output", &outputFile);
Вызов программы с "--output=myfile.txt" или "--output myfile.txt" установитoutputFileв "myfile.txt". Если вы хотите передать строку, содержащую пробелы, вам нужно использовать цитирование, которое подходит для вашей оболочки, например, --output='my file.txt'. -
Массивные параметры. Если параметр связан с массивом, новый элемент добавляется в массив каждый раз, когда этот параметр встречается:
string[] outputFiles; getopt(args, "output", &outputFiles);
Вызов программы с "--output=myfile.txt --output=yourfile.txt" или "--output myfile.txt --output yourfile.txt" установитoutputFilesв[ "myfile.txt", "yourfile.txt" ]. В качестве альтернативы можно установитьarraySep, чтобы разрешить несколько элементов в одном параметре.string[] outputFiles; arraySep = ","; // defaults to "", meaning one element per parameter getopt(args, "output", &outputFiles);
С помощью приведенного кода вы можете вызвать программу с "--output=myfile.txt,yourfile.txt" или "--output myfile.txt,yourfile.txt". -
Хэшовые параметры. Если параметр связан с ассоциативным массивом, ожидается строка вида "name=value" как следующий параметр, или прямо внутри параметра, разделённое знаком "=":
double[string] tuningParms; getopt(args, "tune", &tuningParms);
Вызов программы с e.g. "--tune=alpha=0.5 --tune beta=0.6" установитtuningParmsв [ "alpha" : 0.5, "beta" : 0.6 ]. В качестве альтернативы можно установитьarraySepв качестве разделителя элементов:double[string] tuningParms; arraySep = ","; // defaults to "", meaning one element per parameter getopt(args, "tune", &tuningParms);
С помощью приведенного кода вы можете вызвать программу с "--tune=alpha=0.5,beta=0.6" или "--tune alpha=0.5,beta=0.6". В общем случае ключи и значения могут быть любого парсируемого типа. -
Параметры обратного вызова. Параметр может быть связан с функцией или делегатом с сигнатурой
void function(),void function(string option),void function(string option, string value), или их эквивалентами делегатов.- Если обратный вызов не принимает аргументов, обратный вызов вызывается всякий раз, когда этот параметр виден.
- Если обратный вызов принимает один строковый аргумент, строка параметра (без ведущего дефиса(ов)) передаётся обратному вызову. После этого строка параметра считается обработанной и удаляется из массива параметров.
void main(string[] args) { uint verbosityLevel = 1; void myHandler(string option) { if (option == "quiet") { verbosityLevel = 0; } else { assert(option == "verbose"); verbosityLevel = 2; } } getopt(args, "verbose", &myHandler, "quiet", &myHandler); } - Если обратный вызов принимает два строковых аргумента, строка параметра обрабатывается как параметр с одним аргументом и парсится соответственно. Параметр и его значение передаются обратному вызову. После этого всё, что было передано обратному вызову, считается обработанным и удаляется из списка.
int main(string[] args) { uint verbosityLevel = 1; bool handlerFailed = false; void myHandler(string option, string value) { switch (value) { case "quiet": verbosityLevel = 0; break; case "verbose": verbosityLevel = 2; break; case "shouting": verbosityLevel = verbosityLevel.max; break; default : stderr.writeln("Unknown verbosity level ", value); handlerFailed = true; break; } } getopt(args, "verbosity", &myHandler); return handlerFailed ? 1 : 0; }
- Параметры с несколькими именами
- Иногда желательны синонимы параметров, например, "--verbose", "--loquacious" и "--garrulous" должны иметь одинаковый эффект. Такие альтернативные имена параметров можно включить в спецификацию параметра, используя "|" в качестве разделителя:
bool verbose; getopt(args, "verbose|loquacious|garrulous", &verbose);
- Регистр
- По умолчанию регистр параметров не учитывается. Вы можете изменить это поведение, передав
getoptдирективуcaseSensitiveследующим образом:
bool foo, bar; getopt(args, std.getopt.config.caseSensitive, "foo", &foo, "bar", &bar);В приведенном примере "--foo" и "--bar" распознаются, но "--Foo", "--Bar", "--FOo", "--bAr" и т. д. отклоняются. Директива активна до концаgetopt, или пока не встретится обратная директиваcaseInsensitive:bool foo, bar; getopt(args, std.getopt.config.caseSensitive, "foo", &foo, std.getopt.config.caseInsensitive, "bar", &bar);Параметр "--Foo" отклоняется из-заstd.getopt.config.caseSensitive, но не "--Bar", "--bAr" и т. д., потому что директиваstd.getopt.config.caseInsensitiveотключила учёт регистра до обработки параметра "bar".- Короткие против длинных параметров
- Традиционно программы принимали параметры с одной буквой, предваряемые одним дефисом (например,
-t).getoptбеспрепятственно принимает такие параметры. Когда используется двойной дефис (например,--t), однобуквенный параметр ведет себя так же, как параметр с несколькими буквами. При использовании одного дефиса однобуквенный параметр принимается.
timeoutв5, используйте любой из следующих вариантов:--timeout=5,--timeout 5,--t=5,--t 5,-t5, или-t 5. Форматы, такие как-timeout=5не будут приняты. Более подробную информацию о коротких параметрах см. также в следующем разделе.- Объединение
- Однобуквенные параметры могут быть объединены, т. е. "-abc" эквивалентно
"-a -b -c". По умолчанию этот параметр выключен. Вы можете включить его с помощью директивыstd.getopt.config.bundling:
bool foo, bar; getopt(args, std.getopt.config.bundling, "foo|f", &foo, "bar|b", &bar);В случае если вы хотите включить объединение только для некоторых параметров, объединение может быть выключено с помощьюstd.getopt.config.noBundling.- Обязательные
- Параметр может быть помечен как обязательный. Если этого параметра нет в аргументах, будет выброшено исключение.
bool foo, bar; getopt(args, std.getopt.config.required, "foo|f", &foo, "bar|b", &bar);Требуется только параметр, непосредственно следующий заstd.getopt.config.required.- Передача нераспознанных параметров
- Если приложение должно выполнить свою обработку аргументов, которые
getoptне поняла, оно может передать директивуstd.getopt.config.passThroughфункцииgetopt:
bool foo, bar; getopt(args, std.getopt.config.passThrough, "foo", &foo, "bar", &bar);Нераспознанный параметр, такой как "--baz", будет найден нетронутым вargsпосле возвращенияgetopt.- Генерация информации о помощи
- Если строка параметра следует за другой строкой, эта строка служит описанием для этого параметра. Функция
getoptвозвращает структуру типаGetoptResult. Это возвращаемое значение содержит информацию обо всех переданных параметрах, а также флагbool GetoptResult.helpWanted, указывающий, запрашивалась ли информация об этих параметрах. Функцияgetoptвсегда добавляет параметр для--help|-hдля установки флага, если параметр виден в командной строке.
- Терминатор параметров
- Одиночный двойной дефис завершает сбор
getopt. Он используется для разделения параметров программы от других параметров (например, параметров, передаваемых другой программе). Вызов приведенного выше примера с"--foo -- --bar"обрабатывает foo, но оставляет "--bar" вargs. Сам двойной дефис удаляется из массива аргументов, за исключением случая, когда указана директиваstd.getopt.config.keepEndOfOptions.
- Примеры:
-
auto args = ["prog", "--foo", "-b"]; bool foo; bool bar; auto rslt = getopt(args, "foo|f", "Some information about foo.", &foo, "bar|b", "Some help message about bar.", &bar); if (rslt.helpWanted) { defaultGetoptPrinter("Some information about the program.", rslt.options); }
- перечисление config: int;
-
Параметры конфигурации для
getopt.Вы можете передать их в
getoptв любой позиции, кроме позиции между строкой параметра и связанным с ней указателем.- caseSensitive
-
Включить регистрозависимость
- caseInsensitive
-
Выключить регистрозависимость (по умолчанию)
- bundling
-
Включить объединение
- noBundling
-
Выключить объединение (по умолчанию)
- passThrough
-
Передать нераспознанные аргументы
- noPassThrough
-
Обработать нераспознанные аргументы как ошибки (по умолчанию)
- stopOnFirstNonOption
-
Остановить обработку по первому аргументу, который не похож на параметр
- keepEndOfOptions
-
Не удалять разделитель endOfOptions из args
- required
-
Сделать следующий параметр обязательным
- struct GetoptResult;
-
Результат функции
getopt.helpWantedустанавливается, если параметр--helpили-hбыл передан в парсер параметров.- bool helpWanted;
-
Флаг, указывающий, был ли запрошен вывод справки
- Option[] options;
-
Все возможные параметры
- struct Option;
-
Информация о параметре.
- string optShort;
-
Короткое обозначение параметра
- string optLong;
-
Полное обозначение параметра
- string help;
-
Описание параметра
- bool required;
-
Если параметр обязателен, то его отсутствие приведёт к ошибке
- dchar optionChar;
-
Символ параметра (по умолчанию '-').
По умолчанию '-' но может быть задан до вызова
getopt. - string endOfOptions;
-
Строка, которая традиционно обозначает конец всех параметров (по умолчанию '--').
По умолчанию "--" но может быть задана до вызова
getopt. Присвоение пустой строки кendOfOptionsфактически отключает её. - dchar assignChar;
-
Символ присваивания, используемый в параметрах с параметрами (по умолчанию '=').
По умолчанию '=' но может быть задан до вызова
getopt. - string arraySep;
-
Когда установлено в "", параметры для массивов и ассоциативных массивов обрабатываются как отдельные аргументы. То есть, только один аргумент добавляется или вставляется при каждом появлении переключателя параметра. Если
arraySepустановлено на что-то другое, то каждый параметр сначала разделяется разделителем, и отдельные части обрабатываются как аргументы для того же переключателя параметра.По умолчанию "" но может быть задано до вызова
getopt. - void defaultGetoptPrinter(string text, Option[] opt);
-
Эта функция выводит переданные
Optionи текст выровненным способом вstdout.Сначала выводится переданный текст, за ним идёт перевод строки, затем выводится короткое и полное обозначение каждого параметра. Короткое и полное обозначение выравниваются по самому длинному обозначению каждого
Optionпереданного. Если параметр обязателен, то после полного обозначения параметра выводится "Обязательно:". Если есть сообщение справки, оно выводится далее. Формат показан в этом коде:
foreach (it; opt) { writefln("%*s %*s%s%s", lengthOfLongestShortOption, it.optShort, lengthOfLongestLongOption, it.optLong, it.required ? " Required: " : " ", it.help); }- Параметры:
string textТекст, выводимый в начале вывода справки. Option[] optПолученные Optionиз параметраgetopt
- void defaultGetoptFormatter(Output)(Output output, string text, Option[] opt, string style = "%*s %*s%*s%s\x0a");
-
Эта функция записывает переданный текст и
Optionв диапазон вывода описанным способом в документации функцииdefaultGetoptPrinter, если не используется опция стиля.- Параметры:
Output outputДиапазон вывода, используемый для записи информации о справке. string textТекст, выводимый в начале вывода справки. Option[] optПолученные Optionиз параметраgetoptstring styleСпособ отображения вывода каждого Option.
© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_getopt.html