Я использую Getopt :: Lucid для обработки CLO и столкнулся с интересной и неожиданной проблемой. Следующий код:
push @clo_spec, map { Switch($_) } qw(-c -m -s -p),
map { Switch($_) } qw(--help --man --usage --version),
map { Switch($_) } qw(--debug --verbose),
map { Param($_) } keys %$rc_spec_ref
;
my $clo_o = Getopt::Lucid->getopt(\@clo_spec);
генерирует следующую ошибку:
'Getopt::Lucid::Spec=HASH(0x9383847)' is not a valid option name/alias
Теперь Getopt :: Lucid настраивается путем цитирования строкового выражения, представляющего допустимые параметры, а затем передачи этих строк одной из шести подпрограмм, которые возвращают благословенные хэши. Каждая подпрограмма представляет тип опции; переключатель, счетчик, параметр, список или пара ключей.
Интересная часть состоит в том, что если удаляются любые три выражения карты,
push @clo_spec, #map { Switch($_) } qw(-c -m -s -p),
map { Switch($_) } qw(--help --man --usage --version),
#map { Switch($_) } qw(--debug --verbose),
#map { Param($_) } keys %$rc_spec_ref
;
тогда все отлично работает. Еще более интересная часть заключается в том, что если вы заключите каждое выражение карты в скобки, все также будет работать нормально:
push @clo_spec, (map { Switch($_) } qw(-c -m -s -p)),
(map { Switch($_) } qw(--help --man --usage --version)),
(map { Switch($_) } qw(--debug --verbose)),
(map { Param($_) } keys %$rc_spec_ref)
;
Вышесказанное наводит меня на мысль, что эта проблема не связана с ошибкой в Getopt :: Lucid. Кроме того, я рассмотрел вышеупомянутое исправление после просмотра ссылки на функцию карты, в которой упоминается, что иногда карту можно спутать с запятыми. Perl сгладит встроенные списки, и окружающие скобки, по-видимому, разграничивают каждое выражение карты, но я действительно не понимаю, что происходит.
Может кто-нибудь объяснить, пожалуйста?