2

現在の作業ディレクトリの末尾に別の変数を追加する Perl スクリプトを実行していますが、モジュールの使用に問題があります。

  1. から getcwd を実行するD:\と、返される値は

    D:/ (with forward slash)  
    

    から getcwd を実行するD:\Temp\と、返される値は

    D:/temp (without forward slash)
    

    これにより、状況が非常にトリッキーになります。

    use Cwd;
    $ProjectName = "Project"; # This is a variable supplied by the user
    $directory = getcwd().$ProjectName."\/";
    print $directory."\n";
    

    どちらかで終わるよ

    D:/Project (correct)  
    

    また

    D:/TempProject (instead of D:/Temp/Project)
    

    これは の機能Cwdですか? ドキュメントにはないようです。

  2. この問題を解決するために、次のコードを考えました。それには3行かかります。もっと簡潔な方法を見ることができますか?

    use Cwd;
    $ProjectName = "Project"; # This is a variable supplied by the user
    
    $directory = getcwd();
    $directory =~ s/(.+?)([^\\\/])$/$1$2\//g;  # Append "/" if not terminating with forward/back slash
    $directory .= $ProjectName."\/";
    
    print $directory."\n";
    
4

2 に答える 2

9

独自のパス操作ルーチンを作成する代わりに、File::Specを使用してください。

use Cwd;
use File::Spec;

$ProjectName = "Project";

$cwd = getcwd();
$directory = File::Spec->catdir($cwd, $ProjectName);

print "$directory\n";
于 2009-05-28T17:54:33.067 に答える
3

最初のケースでは、"D:" がボリューム指定子であるため、末尾のスラッシュが含まれています。有効なディレクトリ名ではありません。"D:/" は Unix/Linux のルート ディレクトリに相当します。

迅速で汚い解決策:

$directory .= '/' unless $directory =~ m|/$|;

堅牢でポータブルなソリューションを得るには、非オブジェクト指向のインターフェースを好む場合はFile::SpecまたはFile::Spec::Functionsを使用します。

use Cwd;
use File::Spec::Functions qw(catdir);

my $directory = catdir(getcwd(), $ProjectName);

catdirには末尾のスラッシュが含まれていないことに注意してください。File::Spec は、ホスト オペレーティング システムのディレクトリ区切り記号を使用してパスを作成します。(例: Windows のバックスラッシュ)。

于 2009-05-28T17:58:17.677 に答える