Newsgroup: it.comp.lang.perl
Titolo: parsing degli argomenti di un programma

Vorrei che un mio script in perl supportasse la seguente sintassi:
./script --file_da_esaminare file1 file2 file3 --altra-opzione valore
oppure:
./script --file_da_esaminare *txt --altra-opzione valore
Ho provato a usare getopt::long ma purtroppo non sono riuscito a fargli
capire che file1,file2 e file3 (cosě come quelli generati automaticamente
tramite *txt) sono gli argomenti associati all'opzione 'file_da_esaminare'.
Infatti solo 'file1' č riconosciuto come tale, invece file2 e file3 sono
visti come opzioni sconosciute.
Getopt č veramente potente, mi stupisce che non supporti una situazione del
genere (ma forse sono io che non ho trovato il modo...)
Cosa mi consigliate di fare? Nel caso in cui getopt non mi possa essere
d'aiuto esiste qualcosa di analogo che risponda ai miei requisiti?
Grazie in anticipo
        micron

 Ciao,
Se metti i parametri fra virgolette, funziona anche con i wildchars:
./script --files "*.txt"
Io modificherei il tuo script cosi':
use strict;
use Getopt::Long;
use Data::Dumper;
my @files;
my $altro;
GetOptions( "--files=s" => \@files,
             "--altra-opzione=s" => \$altro );
if ("@files" =~ /[?*]/)
{
     @files = glob("@files" )
}
else
{
     @files = split(/[;, ]/, join(",",@files));
}
print Dumper(\@files);
Ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
MySQL Certified Professional
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

 Io modificherei il tuo script cosi':
[CUT]
Ecco, ancora meglio! :D
Lo split in quel modo non l'avevo mai pensato di usare, a dire la
verità, si impara sempre qualcosa di nuovo.
L'unico caso che può dare problemi ora è:
./script --files "*.txt",file1.exe
Quando ho due minuti vedo come si può risolvere (se non ci pensa
qualcun'altro prima :D).


 ./script --files "*.txt",file1.exe
Non ho controllato in rete, ma: e` una cosa prevista
dalle linee guida POSIX per la command line ?
ciao,
S.
-- 
Stefano Rodighiero      |  
http://larsen.perlmonk.org/blog
mailto:
lar...@perl.it
   |  
http://www.perl.it

 dalle linee guida POSIX per la command line ?
A dire il vero non lo so. Vedo se riesco a recuperare le informazioni da
qualche parte. In effetti, così a memoria, non ricordo programmi che
accettino parametri del genere, ma mi è venuto spontaneo includerlo
nelle possibilità :)
Probabilmente non è un caso contemplato, vedo di verificare.


 intero i parametri.
Infatti è una funzionalità della bash di cui, _in questo momento_, farei
volentieri a meno (preferirei fare il globbing a "mano" nel codice...).
Dovrò trovare un po' di compromessi...
ciao e grazie
        micron

 
Niente a che vedere con il problema in oggetto, ma forse è più comoda la
seguente sintassi per GetOptions:
   my %options;
   Usage() unless GetOptions(\%options, 'files=s@', 'altra-opzione=s', ...);
dove:
1. il primo argomento è un hash ref che conterrà nelle chiavi tutti gli
argomenti dati in linea di comando;
2. non c'è bisogno di mettere i '--' in ogni parametro nella chiamata a
GetOptions;
3. c'è la sintassi s@ per opzioni multi-valore (corrispondentemente
$options{'files'} sarà un array ref);
4. una funzione 'Usage()' che stampa un breve help a linea di comando nel caso
di errata immissione di parametri non fa mai male...! ;-)
by
	- Enrico
--- have fun with 
www.perl.it
 ---

 di errata immissione di parametri non fa mai male...! ;-)
Concordo.
Di solito si consiglia di usare Getopt::Long in coppia con Pod::Usage
(anche nella stessa documentazione di Getopt::Long). Difatti, abilitando
l'opzione auto_help in questo modo:
use Getopt::Long qw(:config auto_help);
se non sono state indicate operazioni per gli argomenti -help e -?,
viene chiamato automaticamente la funzione pod2usage().
Ci sono molte opzioni utili -- tanto per dirne una, no_ignore_case, ad
esempio, quando -a è diverso da -A, -- basta dare uno sguardo al pod di
Getopt::Long.
Discussioni come questa mi piacciono. :D


 Discussioni come questa mi piacciono. :D
E piacciono molto anche a me! Mi avete dato degli ottimi consigli/spunti!!
ciao
        micron