С риском «чрезмерного ответа» - мой взгляд на «Перли» лаконичен, насколько это возможно, не становясь неясным (возможно, я просто заменяю один субъективный термин двумя другими ...: -)
Если в качестве единственного параметра используется массив slurpy, он с радостью не примет аргументов, выходящих за пределы спецификации, которую вы указали в комментариях. Тем не менее, позиционный параметр является обязательным по умолчанию, и proto * необходимы только в том случае, если вы хотите исключить ограничения для всех мульти - предположительно, излишнее для того, что вы хотите здесь. Итак, этого достаточно:
sub MAIN($file , *@others) {
say "Received file, $file, and @others.elems() others."
}
Это близко к тому, что положил mr_ron - но почему бы не пойти с сообщением об использовании по умолчанию, которое MAIN любезно подбирает для вас, изучив ваши параметры:
$ ./f.pl
Usage:
./f.pl <file> [<others> ...]
Кто-то может сказать, что я обманул, отбросив ограничение типа Str на первый параметр, но на самом деле это мало что дает, когда вы ограничиваете строки, потому что числа, указанные в CLI, показываются как тип IntStr (разновидность гибридного типа), которая удовлетворяет ограничению Str. OTOH, ограничивая параметры CLI значениями Num или Int, Perl6 проверит, действительно ли вы вводите цифры - или, по крайней мере, то, что Unicode считает цифрами.
Если вам нужны реальные имена файлов, вы можете сохранить шаг проверки, ограничившись типом IO()
. Тогда это будет работать, только если вы назовете файл. И, наконец, установка where .r
после параметра будет настаивать на том, что он может быть загружен:
sub MAIN(IO() $file where .r, *@others) { ...
Одна короткая строка, которая настаивает на одном обязательном аргументе, который является именем файла, ссылающимся на читаемый файл, с переменным числом других параметров и полезным автоматически генерируемым сообщением об использовании, если все идет вбок ...