Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

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 (Prior) 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 (Canon) 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 pondering the Monastery: (6)
As of 2018-06-18 21:45 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (110 votes). Check out past polls.