Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

perl glob

by Anonymous Monk
on Nov 07, 2013 at 13:42 UTC ( #1061564=perlquestion: print w/replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi monks,

I have just wrote a converter and a simple wrapper that allows to convert all the files with the same extension in one go. The wrapper code as follows:

use warnings; use strict; my $input = shift; my @files; if ($input =~ /^\./) { @files = glob "*$input"; } else { @files = $input; } foreach (@files) { print "$_\n"; system("perl $_"); }

It can read commands like:

perl .ws

Now I want to make the wrapper more powerful such that it can also read something like:

perl test_*.ws

That means all files with name should be converted. How can I realize that?

Thanks a lot for your kind help.

Replies are listed 'Best First'.
Re: perl glob
by talexb (Canon) on Nov 07, 2013 at 13:58 UTC

    Normally this globbing would be handled by the shell, so your two commands would be

    perl *.ws
    perl test_*.ws
    Leaving your script to work its way through @ARGV and process files.

    To make it even simpler, you could just replace with, unless the wrapper script is doing something that you haven't shown here.

    Alex / talexb / Toronto

    Thanks PJ. We owe you so much. Groklaw -- RIP -- 2003 to 2013.

      Sorry for my poor english...

      The is an other long programm which I have wrote for converting scripts in one programming language to the scripts in an other. But with I can only convert one file in one go. E.g.:


      It will create a new script names So I wrote this simple wrapper, to allow me converting several ws files in one go. E.g.:

      perl .ws

      For instance, it converts, and in one go, which I can't achieve with:

      perl .ws.


      perl *.ws

      also didn't work, probably because I also allowed users to define the output filename by themselves, e.g.:


      And here is the relevant codes in

      my $file_name = ""; if (scalar(@ARGV) == 2){ $file_name .= $ARGV[1]; } else { $ARGV[0] =~ s/(.+)\.\S+/$1/; $file_name .= $ARGV[0]; $file_name .= ".is"; }

      I checked here whether the user defined a name for the "is" file, if not the "is" file will take the same name with the "ws" file.

      Many thanks!

Re: perl glob
by hdb (Monsignor) on Nov 07, 2013 at 14:23 UTC

    Under Windows, the "shell" would not expand the wildcard, but then you can simply use:

    my @files = glob $input;

      Thanks dude! That works!

      Even better: Win32::Autoglob handles globbing transparently.

      (Note that it does not handle globbing correctly on OS/2 and DOS, and you better don't set an environment variable named SHELL on Windows or else it will assume running under cygwin.)


      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
Re: perl glob
by Eily (Parson) on Nov 07, 2013 at 14:45 UTC

    Instead of system "perl $_" you could use do. If you could rewrite to work on $_ you could replace your loop with do "" for @files. Or even better if can work on all arguments:

    { local @ARGV = @files; do ""; }

    And if you don't want to rewrite :

    foreach (@files) { local @ARGV = $_; do ""; }

Re: perl glob
by hippo (Abbot) on Nov 07, 2013 at 13:58 UTC

    It's not clear to me from what you have said why you don't just let the shell handle the expansion.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1061564]
Approved by Corion
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (5)
As of 2017-10-20 22:15 GMT
Find Nodes?
    Voting Booth?
    My fridge is mostly full of:

    Results (268 votes). Check out past polls.