2008-09-22 9 views
7

Mam ciąg znaków z możliwymi argumentami wiersza poleceń (przy użyciu programu Read-Eval-Print-Loop) i chcę, aby był on przetwarzany podobnie do argumentów wiersza poleceń po przekazaniu do Getopt :: Long.Jak analizować ciąg za pomocą GetOpt :: Long :: GetOptions?

Aby opracować:

Mam ciąg

$str = '--infile /tmp/infile_location --outfile /tmp/outfile' 

I ma to być analizowany przez getOptions tak, że łatwiej jest dla mnie, aby dodać nowe opcje.

Jednym z rozwiązań, o których mógłbym myśleć, jest podzielenie łańcucha na białe znaki i zastąpienie @ARGV nową tablicą, a następnie wywołanie metody GetOptions. coś jak ...

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 
      ); 

Czy jest jakiś dobry/lepszy sposób?

Odpowiedz

7

Zamiast podziału na białe znaki, należy użyć wbudowanej funkcji glob. Oprócz podziału na białe spacje wykonają standardowe rozszerzenia linii poleceń, a następnie zwrócą listę. (Na przykład * dałoby listę plików itp.) Zaleciłbym również lokalną obsługę @ARG na zasadzie ogólnej.

Jest to jedyny sposób, w jaki można to zrobić bez przepisywania GetOptions. (Najwyraźniej muszę uważniej przeczytać dokumentację.)

5

Wow !!!

myślę, że mogę korzystać zarówno z bentilly i dinomite-tych odpowiedzi i wykonaj następujące czynności:

  • użytkowania glob wykonać standardową linię poleceń Rozszerzenia
  • przekazać tablicę po glob metody GetOptionsFromArray z getopt :: długi (patrz here)

kod może wyglądać ...

GetOptionsFromArray ([glob ($input_line)]); 

A to tylko jedna linia ... fajna (wiem, że muszę zrobić błąd sprawdzania itp.) .. ale jest fajna ...

+0

Pierwszy argument jest odwołaniem do tablicy, więc chcesz "GetOptionsFromArray ([glob ($ input_line)], ...)" –

+0

Dzięki Michael .. tutaj idzie zmiana w kodzie ... – Jagmal

0

Gdy używasz Getopt :: Long na czymś innym niż dane wejściowe użytkownika, należy pamiętać, że niektóre funkcje różnią się w zależności od zmiennej środowiskowej POSIXLY_CORRECT. Możesz to zmienić poprzez odpowiednie wywołanie Konfiguracji.

Obligatory POSIXLY_CORRECT anecdote.

0

Wygląda na to, że metody GetOptionsFromArray i GetOptionsFromString zostały dodane tylko w wersji 2.36, a ponieważ Murphy powiedziałby, że mam tylko wersję 2.35.

Na razie myślę, że będę musiał żyć z lokalnym @ARGV.

Powiązane problemy