Como posso analisar uma seqüência com Getopt :: Longo :: getOptions?
-
02-07-2019 - |
Pergunta
Eu tenho uma string com possíveis argumentos de linha de comando (usando um programa de leitura Eval-Print-Loop) e eu quero que ele seja analisado semelhante aos argumentos de linha de comando quando passou para Getopt :: longa.
Para elaborar:
Eu tenho uma string
$str = '--infile /tmp/infile_location --outfile /tmp/outfile'
Eu quero que ele seja analisado pelo getOptions de modo que é mais fácil para mim para adicionar novas opções.
Uma solução que eu poderia pensar é dividir a string em espaços em branco e substituir @ARGV com nova matriz e, em seguida, chamar getOptions. algo como ...
my @arg_arr = split (/\s/, $input_line);
# This is done so that GetOptions reads these new arguments
@ARGV = @arg_arr;
print "ARGV is : @ARGV\n";
GetOptions (
'infile=s' => \$infile,
'outfile=s' => \$outfile
);
Existe alguma boa maneira melhor /?
Solução
Confira a seção de análise opções de um cadeia arbitrária na href="http://perldoc.perl.org/Getopt/Long.html" rel="nofollow página homem para Getopt :: longo , I acho que ele faz exatamente o que você está procurando.
Outras dicas
Em vez de divisão no espaço em branco, use o built-in função glob. Além de divisão no espaço em branco, que vai fazer as expansões linha de comando padrão, em seguida, retornar uma lista. (Por exemplo * daria uma lista de arquivos, etc.) Também gostaria de recomendar locais-izing @ARG no princípio geral.
Fora isso, essa é a única maneira que você pode fazê-lo sem reescrever getOptions. (Claramente eu preciso ler a documentação com mais cuidado.)
Wow !!!
Eu acho que pode usar tanto de respostas bentilly e dinomite das e faça o seguinte:
- uso glob para executar expansões linha de comando padrão
- passar a matriz após glob para o método GetOptionsFromArray do Getopt :: Long (veja aqui )
Código pode ser algo como ...
GetOptionsFromArray ([glob ($input_line)]);
E isso é apenas uma linha .. cool (eu sei que tenho que fazer alguma verificação de erros etc) .. mas é legal ...
Quando você usa Getopt :: longa em algo diferente de entrada do usuário, esteja ciente de que algumas características são diferentes com base na variável de ambiente POSIXLY_CORRECT. Você pode substituir esse com a chamada apropriada para configurar.
Parece que os métodos GetOptionsFromArray e GetOptionsFromString foram adicionados apenas em v2.36 e como Murphy diria que eu tenho a versão 2.35 somente.
Por enquanto, acho que vou ter que viver com @ARGV local.