- 论坛徽章:
- 1
|
给大家一段伪代码:
- sub init
- {
- *Dir = \$Bin;
- *RealDir = \$RealBin;
- if($0 eq '-e' || $0 eq '-')
- {
- # perl invoked with -e or script is on C<STDIN>
- $Script = $RealScript = $0;
- $Bin = $RealBin = getcwd();
- }
- else
- {
- my $script = $0;
- if ($^O eq 'VMS')
- {
- ($Bin,$Script) = VMS::Filespec::rmsexpand($0) =~ /(.*\])(.*)/s;
- ($RealBin,$RealScript) = ($Bin,$Script);
- }
- else
- {
- my $dosish = ($^O eq 'MSWin32' or $^O eq 'os2');
- unless(($script =~ m#/# || ($dosish && $script =~ m#\\#))
- && -f $script)
- {
- my $dir;
- foreach $dir (File::Spec->path)
- {
- my $scr = File::Spec->catfile($dir, $script);
- if(-r $scr && (!$dosish || -x _))
- {
- $script = $scr;
- if (-f $0)
- {
- # $script has been found via PATH but perl could have
- # been invoked as 'perl file'. Do a dumb check to see
- # if $script is a perl program, if not then $script = $0
- #
- # well we actually only check that it is an ASCII file
- # we know its executable so it is probably a script
- # of some sort.
- $script = $0 unless(-T $script);
- }
- last;
- }
- }
- }
- croak("Cannot find current script '$0'") unless(-f $script);
- # Ensure $script contains the complete path incase we C<chdir>
- $script = File::Spec->catfile(getcwd(), $script)
- unless File::Spec->file_name_is_absolute($script);
- ($Script,$Bin) = fileparse($script);
- # Resolve $script if it is a link
- while(1)
- {
- my $linktext = readlink($script);
- ($RealScript,$RealBin) = fileparse($script);
- last unless defined $linktext;
- $script = (File::Spec->file_name_is_absolute($linktext))
- ? $linktext
- : File::Spec->catfile($RealBin, $linktext);
- }
- # Get absolute paths to directories
- $Bin = abs_path($Bin) unless (!$Bin || File::Spec->file_name_is_absolute($Bin));
- $RealBin = abs_path($RealBin) unless (!$RealBin || File::Spec->file_name_is_absolute($RealBin));
- }
- }
- }
复制代码 |
|