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 /?

Foi útil?

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.

obrigatório POSIXLY_CORRECT anedota .

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top