Hello,

I've started to play with portable scripts, and am making heavy use of
File::Spec to help me.  I just did a small test on VMS with the
following script, and found the result to be a bit disturbing:

------------------------------- FOO.PL -------------------------------
   use File::Spec;
   
   foreach my $f ("FOO:[BAR.COOKIE.BANANA]HAHA.TXT",
                  "[BAR.COOKIE.BANANA]HAHA.TXT",
                  "FOO:[-.BAR.COOKIE.BANANA]HAHA.TXT",
                  "[-.BAR.COOKIE.BANANA]HAHA.TXT",
                  "FOO:[--.BAR.COOKIE.BANANA]HAHA.TXT",
                  "[--.BAR.COOKIE.BANANA]HAHA.TXT",
                  "FOO:[BAR.-.COOKIE.BANANA]HAHA.TXT",
                  "[BAR.-.COOKIE.BANANA]HAHA.TXT",
                  "FOO:[BAR.--.COOKIE.BANANA]HAHA.TXT",
                  "[BAR.--.COOKIE.BANANA]HAHA.TXT",
                  "FOO:[BAR.COOKIE.-.BANANA]HAHA.TXT",
                  "[BAR.COOKIE.-.BANANA]HAHA.TXT",
                  "FOO:[BAR.COOKIE.--.BANANA]HAHA.TXT",
                  "[BAR.COOKIE.--.BANANA]HAHA.TXT",
                  "FOO:[BAR.COOKIE.BANANA.-]HAHA.TXT",
                  "[BAR.COOKIE.BANANA.-]HAHA.TXT",
                  "FOO:[BAR.COOKIE.BANANA.--]HAHA.TXT",
                  "[BAR.COOKIE.BANANA.--]HAHA.TXT",
                  "FOO:[BAR.000000.][000000.][BANANA.--]HAHA.TXT",
                  "[BAR.000000.][000000.][BANANA.--]HAHA.TXT",
                  "FOO:[BAR.000000.][000000.][BANANA.--.000000]HAHA.TXT",
                  "[BAR.000000.][000000.][BANANA.--.000000]HAHA.TXT",
                  "FOO:[BAR.000000.][000000.][-.-.000000]HAHA.TXT",
                  "[BAR.000000.][000000.][--.-.000000]HAHA.TXT",
                  ) {
       print "-" x 70,"\n";
       print "(",join(", ",File::Spec->splitpath($f)),")\n";
       print File::Spec->canonpath($f),"\n";
   }
   print "-" x 70,"\n";
----------------------------------------------------------------------
   $ perl foo.pl
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.BANANA]HAHA.TXT
   ==>[BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[-.BAR.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[-.BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [-.BAR.COOKIE.BANANA]HAHA.TXT
   ==>[-.BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[--.BAR.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[--.BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [--.BAR.COOKIE.BANANA]HAHA.TXT
   ==>[--.BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.-.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.-.COOKIE.BANANA]HAHA.TXT
   ==>[COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.--.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[-.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.--.COOKIE.BANANA]HAHA.TXT
   ==>[-.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.-.BANANA]HAHA.TXT
   ==>FOO:[BAR.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.-.BANANA]HAHA.TXT
   ==>[BAR.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.--.BANANA]HAHA.TXT
   ==>FOO:[BAR.-.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.--.BANANA]HAHA.TXT
   ==>[BAR.-.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.BANANA.-]HAHA.TXT
   ==>FOO:[BAR.COOKIE]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.BANANA.-]HAHA.TXT
   ==>[BAR.COOKIE]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.BANANA.--]HAHA.TXT
   ==>FOO:[BAR.COOKIE.-]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.BANANA.--]HAHA.TXT
   ==>[BAR.COOKIE.-]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.000000.][000000.][BANANA.--]HAHA.TXT
   ==>FOO:[BAR.000000.-]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.000000.][000000.][BANANA.--]HAHA.TXT
   ==>[BAR.000000.-]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.000000.][000000.][BANANA.000000]HAHA.TXT
   ==>FOO:[BAR.000000.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.000000.][000000.][BANANA.000000]HAHA.TXT
   ==>[BAR.000000.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.000000.][000000.][BANANA.--.000000]HAHA.TXT
   ==>FOO:[BAR.000000.-.000000]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.000000.][000000.][BANANA.--.000000]HAHA.TXT
   ==>[BAR.000000.-.000000]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.000000.][000000.][-.-.000000]HAHA.TXT
   ==>FOO:[BAR.-.000000]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.000000.][000000.][--.-.000000]HAHA.TXT
   ==>[BAR.--.000000]HAHA.TXT
   ----------------------------------------------------------------------
----------------------------------------------------------------------

As can be seen, there are things that don't really happen, like
[BAR.COOKIE.BANANA.--] only got changed to [BAR.COOKIE.-], not [BAR]
(basically, the current VMS.pm doesn't handle multiple dashes very
well).  Also, I noticed that things like FOO.000000] would be
converted to FOO], which I think is an absolute no-no (you CAN have a
000000.DIR), only [000000.][, .][000000] and [000000. should be
reduced.  While I'm at it, < and > should be changed to [ and ].

My patch (attached as VMD.pm.diff, produced with diff -u) makes the
above errors go away.  I've based the things I do on a decade of
experience with VMS, having hacked similar things a long time ago in
GNU emacs and so on.

The same script with my version of VMS.pm results in the following:

----------------------------------------------------------------------
   $ perl "-IUSER:[LEVITTE.WRK.PERL-HACKS]" foo.pl
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.BANANA]HAHA.TXT
   ==>[BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[-.BAR.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[-.BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [-.BAR.COOKIE.BANANA]HAHA.TXT
   ==>[-.BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[--.BAR.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[--.BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [--.BAR.COOKIE.BANANA]HAHA.TXT
   ==>[--.BAR.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.-.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.-.COOKIE.BANANA]HAHA.TXT
   ==>[COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.--.COOKIE.BANANA]HAHA.TXT
   ==>FOO:[-.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.--.COOKIE.BANANA]HAHA.TXT
   ==>[-.COOKIE.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.-.BANANA]HAHA.TXT
   ==>FOO:[BAR.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.-.BANANA]HAHA.TXT
   ==>[BAR.BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.--.BANANA]HAHA.TXT
   ==>FOO:[BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.--.BANANA]HAHA.TXT
   ==>[BANANA]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.BANANA.-]HAHA.TXT
   ==>FOO:[BAR.COOKIE]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.BANANA.-]HAHA.TXT
   ==>[BAR.COOKIE]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.COOKIE.BANANA.--]HAHA.TXT
   ==>FOO:[BAR]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.COOKIE.BANANA.--]HAHA.TXT
   ==>[BAR]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.000000.][000000.][BANANA.--]HAHA.TXT
   ==>FOO:[BAR]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.000000.][000000.][BANANA.--]HAHA.TXT
   ==>[BAR]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.000000.][000000.][BANANA.000000]HAHA.TXT
   ==>FOO:[BAR.000000.BANANA.000000]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.000000.][000000.][BANANA.000000]HAHA.TXT
   ==>[BAR.000000.BANANA.000000]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.000000.][000000.][BANANA.--.000000]HAHA.TXT
   ==>FOO:[BAR.000000]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.000000.][000000.][BANANA.--.000000]HAHA.TXT
   ==>[BAR.000000]HAHA.TXT
   ----------------------------------------------------------------------
   FOO:[BAR.000000.][000000.][-.-.000000]HAHA.TXT
   ==>FOO:[000000]HAHA.TXT
   ----------------------------------------------------------------------
   [BAR.000000.][000000.][--.-.000000]HAHA.TXT
   ==>[-.000000]HAHA.TXT
   ----------------------------------------------------------------------
----------------------------------------------------------------------

Cheers,
Richard

-----
Please consider sponsoring my work on free software.
See http://www.free.lp.se/sponsoring.html for details.

-- 
Richard Levitte     | http://richard.levitte.org/ | Tunnlandsv. 52
Levitte Programming | http://www.lp.se/           | S-168 36 Bromma
T: +46-708-26 53 44 |                             | SWEDEN
     "Price, performance, quality...  choose the two you like"
--- File/Spec/VMS.pm    2004-07-22 22:52:58.000000000 +0200
+++ VMS.pm      2004-07-23 00:13:39.000000000 +0200
@@ -155,16 +155,34 @@
       else          { return vmsify($path);  }
     }
     else {
-      $path =~ s/([\[<])000000\./$1/g;                  # [000000.foo     ==> [foo
-      $path =~ s/([^-]+)\.(\]\[|><)?000000([\]\>])/$1$3/g;  # foo.000000] ==> foo]
-      $path =~ s-\]\[--g;  $path =~ s/><//g;            # foo.][bar       ==> foo.bar
-      1 while $path =~ s{([\[<-])\.-}{$1-};             # [.-.-           ==> [--
-      $path =~ s/\.[^\[<\.]+\.-([\]\>])/$1/;            # bar.foo.-]      ==> bar]
-      $path =~ s/([\[<])(-+)/$1 . "\cx" x length($2)/e; # encode leading '-'s
-      $path =~ s/([\[<\.])([^\[<\.\cx]+)\.-\.?/$1/g;    # bar.-.foo       ==> foo
-      $path =~ s/([\[<])(\cx+)/$1 . '-' x length($2)/e; # then decode
-      $path =~ s/^[\[<\]>]{2}//;                        # []foo           ==> foo
-      return $path;
+       $path =~ tr/<>/[]/;                     # < and >       ==> [ and ]
+       $path =~ s/\]\[\./\.\]\[/g;             # ][.           ==> .][
+       $path =~ s/\[000000\.\]\[/\[/g;         # [000000.][    ==> [
+       $path =~ s/\[000000\./\[/g;             # [000000.      ==> [
+       $path =~ s/\.\]\[000000\]/\]/g;         # .][000000]    ==> ]
+       $path =~ s/\.\]\[/\./g;                 # foo.][bar     ==> foo.bar
+       while ($path =~ s/([\[\.])(-+)\.(-+)([\.\]])/$1$2$3$4/) {}
+                                               # That loop does the following
+                                               # with any amount of dashes:
+                                               # .-.-.         ==> .--.
+                                               # [-.-.         ==> [--.
+                                               # .-.-]         ==> .--]
+                                               # [-.-]         ==> [--]
+       while ($path =~ s/([\[\.])[^\]\.]+\.-(-+)([\]\.])/$1$2$3/) {}
+                                               # That loop does the following
+                                               # with any amount (minimum 2)
+                                               # of dashes:
+                                               # .foo.--.      ==> .-.
+                                               # .foo.--]      ==> .-]
+                                               # [foo.--.      ==> [-.
+                                               # [foo.--]      ==> [-]
+                                               #
+                                               # And then, the remaining cases
+       $path =~ s/\.[^\]\.]+\.-\./\./g;        # .foo.-.       ==> .
+       $path =~ s/\[[^\]\.]+\.-\./\[/g;        # [foo.-.       ==> [
+       $path =~ s/\.[^\]\.]+\.-\]/\]/g;        # .foo.-]       ==> ]
+       $path =~ s/\[[^\]\.]+\.-\]/\[\]/g;      # [foo.-]       ==> []
+       return $path;
     }
 }
 

Reply via email to