package path; use strict; use warnings; my $sep; my $sep_not; BEGIN { if($^O=~/linux|os2|vms|unix|epoc/i) { $sep=qr!/!; $sep_not=qr![^/]!; } elsif($^O=~/win/i) { $sep=qr/\\/; $sep_not=qr/[^\\]/; } elsif($^O=~/cygwin/i) { $sep=qr'[/\\]'; $sep_not=qr'[^/\\]'; } elsif($^O=~/mac/i) { $sep=qr!:!; $sep_not=qr![^:]!; } else { $sep=qr([/\\:]); $sep_not=qr([^/\\:]); } } sub clean($) { my $path=shift; 1 while( $path=~s!$sep($sep)!$1!gs ); 1 while( $path=~s!(^|$sep)\.$sep!$1!s ); 1 while( $path=~s!$sep$sep_not*$sep\.\.!!s ); 1 while( $path=~s!^$sep\.\.?(?=$sep)!!s ); 1 while( $path=~s!^\.$sep!!s ); 1 while( $path=~s!($sep)\.$!$1!s ); return $path; } sub strip($) { my $path=shift; 1 while( $path=~s!^\.\.?$sep!!s ); 1 while( $path=~s!(^|$sep)\.\.?(?=$sep|$)!$1!s ); 1 while( $path=~s!$sep($sep)!$1!gs ); return $path; } 1;