At 7:30 AM -0400 4/18/02, Chris Nandor wrote:
>At 11:40 +0200 2002.04.18, Thomas Wegner wrote:
>>Noooooooo! Don't abuse File::Spec.
>
>Amen, halleluja, preach it brother!
>
>Just to repeat: knowing the path separator is almost never useful toward
>the end of producing portable code.  File::Spec most likely does whatever
>you need without knowing it.  And further, even if you wanted to write
>portable code that way, you couldn't do it: VMS doesn't have the same
>notion of path separators that Mac and Unix have.  You would wind up just
>reimplementing File::Spec itself.  :-)

You're right. Not to seem argumentative, here's a case where I didn't 
find a way to avoid conjuring a local path separator:

I wrote a small all-Perl utility to prevent line-ending confusion as 
I fling files among Mac Classic, OS X-darwin/UNIX/Linux, and 
NT/Win32/DOS systems during development, testing, and deployment. I 
guess I'm lucky not to have VMS in the picture :-)

The core of my utility is Perl's "inplace" file edit with the -i 
switch, or as I use it, the special variable $^I.

A typical usage of $^I:
   local $^I  = '.bak';
which creates a copy of the original file, with '.bak' appended to 
the filename.

There's also:
   local $^I  = "$another_dir/*";
which names the copy with $another_dir prepended to the filename 
(symbolized by '*').

This is handy because my utility can extract files matched by some 
criteria and put them in a separate directory for line-end conversion.

But that slash before the '*' became a problem when I happened to use 
my utility from within MacPerl.

Excerpts from my solution:

# A low-cycle hack to get a probable path separator
my $SEP = "\n" eq "\012" ?     '/' :   # *N*X
           "\n" eq "\015" ?     ':' :   # Mac
          "\n" eq "\015\012" ? '\' :   # DOS/Win ('/' often works)
                                '/' ;   # default

# Duplicate into $DESTINATION_DIR acceptable matched files from $SOURCE_DIR.
   opendir DIR, $SOURCE_DIR
       or die "Can't open $SOURCE_DIR: $!\n";

   local @ARGV = grep { -f and !/^\./ and m/$PATTERN/ } readdir DIR
       or die "No files to duplicate";

   close DIR;

   local $^I   = "$DESTINATION_DIR$SEP*";

   while (<>) {
       print;
       push @files_copied, $ARGV if eof;
   }

Note that the above is not where the line-end conversion happens.

Anyway, I've thought of releasing this utility -- BBEdit/OS X workers 
will find it especially handy, but it works in 'all' three realms -- 
but I've had some doubts about the separator issue. The little $SEP 
routine above might not be 100% reliable. OTOH, my development style 
tends to stress-test everything around me at certain stages, and this 
has *always* worked.

I'd love to hear about hidden traps or alternatives.

1;
-- 

   - Bruce

__bruce_van_allen__santa_cruz_ca__

Reply via email to