Добавив к любви map
и grep
, мы можем написать простой парсер командной строки.
my %opts = map { $_ => 1 } grep { /^-/ } @ARGV;
Если мы хотим, мы можем установить для каждого флага его индекс в @ARGV:
my %opts = map { $ARGV[$_] => $_ } grep { $ARGV[$_] =~ /^-/ } 0 .. $#ARGV;
Таким образом, если у флага есть аргумент, мы можем получить аргумент так:
if( defined( $opts{-e} ) ) {
my $arg = $ARGV[ $opts{-e} ];
# do -e stuff for $arg
}
Конечно, некоторые люди будут плакать, что мы заново изобретаем колесо, и нам следует использовать getopt или какой-то другой его вариант, но, честно говоря, это было довольно легко изобрести заново. Кроме того, я не люблю getopt.
Если вам не нравится, как долго некоторые из этих строк, вы всегда можете использовать промежуточные переменные или просто удобные разрывы строк (эй, фанатики Python? Вы слышали это? Мы можем поместить одну строку кода в две строки, и это все еще работает!), чтобы он выглядел лучше:
my %opts = map { $ARGV[$_] => $_ }
grep { $ARGV[$_] =~ /^-/ } 0 .. $#ARGV;