2009-05-28 3 views
2

다른 변수를 현재 작업 디렉토리의 끝에 첨부하기 위해 Perl 스크립트를 사용하고 있지만 모듈 사용에 문제가 있습니다. 내가 D:\Temp\에서에 getcwd를 실행하면Perl getcwd 정방향 슬래시 끝내기

  1. 내가 D:\에서에 getcwd 실행하면, 반환 값이

    D:/ (with forward slash) 
    

    이며, 반환되는 값은

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

답변

9

사용 File::Spec 대신 자신의 경로 조작 루틴을.

use Cwd; 
use File::Spec; 

$ProjectName = "Project"; 

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

print "$directory\n"; 
+0

File :: Spec.에 대해 알려 주셔서 감사합니다. catdir과 catfile을 사용하기 위해 전체 스크립트를 변경해야합니다. 나는 그것이 장기적으로 더 낫다는 것을 확신합니다. – Andy

3

"D :"는 볼륨 지정자이므로 첫 번째 경우에는 슬래시가 포함됩니다. 올바른 디렉토리 이름이 아닙니다. "D : /"는 Unix/Linux의 루트 디렉토리와 유사합니다. catdir을 수행

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

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

하는 것으로 :

신속하고 더러운 솔루션 :가 아닌 객체 지향 인터페이스를 선호하는 경우

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

강력한 휴대용 솔루션, File::Spec 또는 File::Spec::Functions를 사용은 슬래시를 포함하고 File :: Spec은 호스트 운영 체제의 디렉토리 분리 기호를 사용하여 경로를 작성합니다. (예 : Windows의 경우 백 슬래시).

+0

나는 어떤 식으로도 신경 쓸 생각이 없다. File :: Spec이 나를 잘 해줄 것이라고 생각한다. 고맙습니다. – Andy