From: "Rob Dixon" <[EMAIL PROTECTED]>
> "Jenda Krynicky" <[EMAIL PROTECTED]> wrote in message
> 3E1349E5.27703.3CB576EE@localhost">news:3E1349E5.27703.3CB576EE@localhost...
> > From: "Rob Dixon" <[EMAIL PROTECTED]>
> > > But glob 'absent_file.txt' returns ('absent_file.txt') so I think
> > > this does what's required. As perldoc says, glob EXPR returns the
> > > value of EXPR with filename expansions such as the standard Unix
> > > shell /bin/csh would do.
> >
> > I see ... it only returns nothing if the parameter contained a * or
> > ?
> >
> > I remember having some discussions regarding this and we agreed that
> > even this should survive the cmdline globbing.
> 
> Sounds like a little overactive ego on the part of the shell in that
> case. You're saying that the script in
> 
>     script.pl *.ext file.ext
> 
> would see an @ARGV of
> 
>    ('*.ext', 'file.ext')
> 
> if there were no files with this extension, but
> 
>     ('file.ext', 'file1.ext', 'file2.ext', 'file.ext')
> 
> if all of these (three) files existed?
> 
> Then how do you pass '*.ext' as ('*.ext') if there are such files? 

If we are talking about unix shells

        script.pl '*.ext' file.ext

And actually that's what will work with G.pm as well.

And yes you are right, that's exactly what is the shell supposed to 
be doing.

> I
> suppose you can pick up the entire command line (I think?) and process
> that, but I'm very glad most languages don't do clever 'useful' things
> with your parameter list before called code gets to see them.

The whole problem is that the process gets the commandline if you use 
Windows and a list of parameters if you use Unix.

Normaly the C runtime under Windows parses the commandline and fills 
the argv array. Which is exactly what happens if you run a Perl 
script under windows. The system passes the cmdline and the runtime 
breaks it apart. And breaks it. And your program is supposed to do 
the globbing, even though the runtime already stripped some well 
needed info.

The G.pm basicaly overcomes the broken @ARGV and parses the cmdline 
and globs the parameters at the same time. Close to the Unix way.

If you do not want that you either do not use G.pm and glob just the 
stuff you want or 
        use G qw(NOGLOB StripPerlFromCommandLine GetCommandLine);

        $rawcmdline = GetCommandLine();
        $cmdlineparams = StripPerlFromCommandLine($rawcmdline);

and parse the raw commandline. 
(Actually it's not totally raw. The IO redirections and pipes are 
already processed by the shell and NOT passed to the process.)

> > So that you could print
> >
> > Cannot open file *.txt
> > or
> > No files match the *.txt mask
> >
> >
> > If you happen to have several masks with different meanings it might
> > be good to be able to say which one did not return anything. And it
> > may not of course :-) I was told this is the behaviour of the Unix
> > shells ...
> >
> 
> Fine, but rather than have the shell performing obscure gymnastics
> beneath me I'd rather code it explicitly:
> 
>     for (@ARGV) { print "No files match the $_ mask\n" unless glob };
>     my @input_files = map glob, @ARGV;

Problem is that under Unix the shell IS performing the gymnastics.

You can quote some params to ensure they are not globbed, but the 
default is globbing.
 
> > > > From: "Rob Dixon" <[EMAIL PROTECTED]>
> > > > >     my @input_files = map glob, @ARGV;
> >
> > There's one more bad thing about this code. Suppose the script was
> > called like this
> >
> > script.pl "hello world.doc"
> >
> > then the @ARGV = ( 'hello world')
> > but the line above will set @input_files to
> > ( 'hello', 'world.doc' )
> 
> Not at all. @ARGV would equal ( "hello world.doc" ) and the statement
> would set @input_files = ( "hello world.doc" ).

What's your version of Perl?

In file zkGlob.pl I have this:
        #!perl
        print "\@ARGV = ( '" . join( "', '", @ARGV) . "')\n\n";
        @input_files = map {glob $_} @ARGV;
        print "\@input_files = ( '" . join( "', '", @input_files) . 
"')\n\n";

call it as:
        c:\temp\zkGlob.pl "hello world.doc" *.txt

and get:
        @ARGV = ( 'hello world.doc', '*.txt')

        @input_files = ( 'hello', 'world.doc', 'te-fetch.txt')

Jenda
===== [EMAIL PROTECTED] === http://Jenda.Krynicky.cz =====
When it comes to wine, women and song, wizards are allowed 
to get drunk and croon as much as they like.
        -- Terry Pratchett in Sourcery


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to