Прежде всего, binding operator является =~
, а не ~=
. Это легко запомнить, поскольку у него есть аналог - !~
(означает «не соответствует»). Но это простая опечатка.
Что более важно, однако, это сам подход: если вы хотите соответствовать '-'
и '--'
, шаблон должен быть записан как /^--?/
. Однако неясно, действительно ли аргумент '---abc'
или нет. Если нет, то регулярное выражение должно выглядеть следующим образом:
/^--?[^-]+$/
... в противном случае это достаточно просто проверить первый символ соответствующих паров против «-», и с использованием регулярных выражений, очевидно, является излишним. Например:
if (substr($ARGV[0], 0, 1) eq '-' || substr($ARGV[1], 0, 1) eq '-') {
# invalid params detected
}
Тем не менее, как вы пытались осуществить его, оно должно было быть записано как /^-+/
, не /^-*/
. Последний соответствует любому количеству дефисов в начале строки - в том числе 0 дефисов. Вот почему строка abc
прошла проверку. Фактически, любая строка прошла бы проверку.
Как совет: используйте модуль perldoc.perl.org/Getopt/Long.html. Потребуется еще некоторое время, чтобы узнать, как использовать их в первый раз, но тогда это сэкономит вам много хлопот ... :-) – MarcoS
Действительно, загляните в [Getopt :: Long] (http: /search.cpan.org/perldoc?Getopt::Long). Это проще в использовании, чем даже тривиальное переосмысление колеса. – ikegami