in reply to Re: Re: Re: Overwrite file protection
in thread Overwrite file protection

I vote for a more detailed version of the post, Monsieur. I'd be interested in the strangeness, and I've never done fileglobbing before.


“Every bit of code is either naturally related to the problem at hand, or else it's an accidental side effect of the fact that you happened to solve the problem using a digital computer.”
M-J D
  • Comment on Re: Re: Re: Re: Overwrite file protection

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Overwrite file protection
by monsieur_champs (Curate) on Jun 17, 2003 at 13:34 UTC

    A little introduction to Filename Globbing

    There are many ways to interact over filenames. One of the most flexible is file globbing.

    File globbing is a way to aquire filenames from your harddisk without having to run trought a directory tree. From the perlop manual:

    If what's within the angle brackets is neither a filehandle nor a simple scalar variable containing a filehandle name, typeglob, or typeglob reference, it is interpreted as a filename pattern to be globbed, and either a list of filenames or the next filename in the list is returned, depending on context. This distinction is determined on syntactic grounds alone. That means "<$x>" is always a readline() from an indirect handle, but "<$hash{key}>" is always a glob(). That's because $x is a simple scalar variable, but $hash{key} is not--it's a hash element.

    One level of double-quote interpretation is done first, but you can't say "<$foo>" because that's an indirect filehandle as explained in the previous paragraph. (In older versions of Perl, programmers would insert curly brackets to force interpretation as a filename glob: "<${foo}>". These days, it's considered cleaner to call the internal function directly as "glob($foo)", which is probably the right way to have done it in the first place.) For example:

    while (<*.c>) { chmod 0644, $_; }

    is roughly equivalent to:

    open(FOO, "echo *.c | tr -s ' \t\r\f' '\\012\\012\\012\\012'|" +); while (<FOO>) { chomp; chmod 0644, $_; }

    except that the globbing is actually done internally using the standard "File::Glob" extension. Of course, the shortest way to do the above is:

    chmod 0644, <*.c>;

    And that's it. I think you would like to take a deeper look at the perlop manual, and read more about this operator. Feel free to post a new question at Seekers of Perl Wisdom or ask me directly about this.

    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    Just Another Perl Monk