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; } }