I'm sorry. I should explain what's going on behind the scene:
When you surround your filename expression (actually, a scalar holding the filename) with '<' and '>', what you get is a file glob. That's the name of this use of '<' and '>' surrounding a scalar designing a filename or something that looks like a file name set (think on it as the equivalent of using dir *.txt on the old D.O.S.).
File globbing is used to do strange (not that strange, indeed) things with sets of filenames.
The strange behavior of your script was because the file name globbing was working when you didin't like it to.
Maybe I should rewrite this comment, I feel that it may confuse you. If it do so, please let me know and I will try to fix it up
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Just Another Perl Monk
| [reply] [d/l] |
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
| [reply] |
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
| [reply] [d/l] [select] |