http://www.perlmonks.org?node_id=963203

biohisham has asked for the wisdom of the Perl Monks concerning the following question:

Hello monks,

So I have been toying with this concept these few days on my Ubuntu machine using Getopt::Long, what I basically aim to achieve is to pass parameters to the program such as the following:

$perl ReadingMultipleFiles.pl -param1 arg -param2 arg --file *.txt

So my program receives many other options that are strings or integers and I aim to run it on an entire folder of .txt files such that the user has an option of either calling the program on one file by passing the file name in this fashion

$perl ReadingMultipleFiles.pl -param1 arg -param2 arg --file foo.txt

or just run it universally on all files via a glob (*) from the STDIN as mentioned above.

Trying various tricks the closer I got to achieving this was through implementing options with multiple values or storing in a hash, however, in both cases, only one file from a group of files is read before the program exits.

#strictures on #ReadingMultipleFiles.pl my @files; GetOptions( #many other integer and string options .... "file=s"=>\@files ..... ); foreach(@files){ print $_, "\n"; #only one file from a group } ### #a hash based way ### use Data::Dumper; my %hash; GetOptions(\%hash, 'files=s@'); print Dumper(\%hash); #only one file from a group
I can't think of another way to do this and I don't want to drastically alter my program design so if I can get you to my rescuing esteemed ones it will be awesome.

David R. Gergen said "We know that second terms have historically been marred by hubris and by scandal." and I am a two y.o. monk today :D, June,12th, 2011...

Replies are listed 'Best First'.
Re: Reading from a glob into Getopt::Long
by Corion (Patriarch) on Apr 03, 2012 at 09:34 UTC

    On unixish shells, it is the shell, not your program that expands globs. The customary approach to handle this situation is to process @ARGV (instead of @files) after GetOpt has taken all switches away:

    GetOptions( ... ); my @files = @ARGV; ... rest of program ...

    The alternative approach would be to quote the glob on the command line to prevent the shell from expanding it:

    > myprog.pl --filespec '*.mp3'

    ... and afterwards expand it in your program using File::Glob or whatever globbing semantics you want to provide.

      This quotation of the glob in the shell is awesome indeed !

      Well, I think I was just overworking my brain to realize that I simply might as well use a flag in GetOptions, that will be neater and more efficient since I know a priori that I wanna deal with a specific file type format so I will just need to glob it internally on the program itself rather than from the shell, that will also give me the flexibility of adding another option or flag to process a file by passing its name as an argument to that option. I used File::Wildcard then to capture all these files and then process them as elements in an array.

      use strict; use warnings; use Getopt::Long; use File::Wildcard; use Data::Dumper; my $foo = File::Wildcard->new(path=>"./*.tab.txt"); my @arrayFiles; GetOptions( "extract_all"=>\&goIt ); sub goIt{ while (my $file = $foo->next){ push @arrayFiles, $file; } #do something with @arrayFile #through a subroutine } print Dumper(\@arrayFiles);


      David R. Gergen said "We know that second terms have historically been marred by hubris and by scandal." and I am a two y.o. monk today :D, June,12th, 2011...
Re: Reading from a glob into Getopt::Long
by nicky (Novice) on Jul 30, 2015 at 18:08 UTC

    I know this thread is a few years old but I was looking for this today. This is what I found from http://www.perlmonks.org/?node_id=919467

    GetOptions( #many other integer and string options .... "file=s{,}"=>\@files ..... );