2010-10-12 78 views
1

由於一些亂七八糟的舊代碼,如何在Perl中更正文件的操作系統特定路徑?

$path = [OS specific base DIR name][hardcoded Linux file path] 

所以在Linux上,它是像

$path = /common/path/to/dir/pathtofile/name.extension 

但在Windows成爲這個

$path = C:\path\to\dir\pathtofile/name.extension 

某些代碼在Windows上失敗,因爲它期望\,而它得到/

有沒有可以幫助我的Perl函數?

喜歡的東西

print "$path\n"; 
$path = <some function> $path; 
print "$path\n"; 

C:\path\to\dir\pathtofile/name.extension 
C:\path\to\dir\pathtofile\name.extension 
+5

Windows不介意反斜槓而不是反斜槓 - 不在API中。那麼,你是否提供了一個'cmd.exe'進程的文件名(因爲這確實得到了很多/引入命令選項)? – 2010-10-12 06:50:48

+0

@Jonathan:謝謝,我早該回答。在我發佈這個問題後,我發現正斜槓並不是真正的問題(正如你在這裏正確提到的那樣)。 – Lazer 2010-10-14 06:01:04

回答

6

File::Spec模塊系列正是出於這個原因而存在的。您可能需要考慮使用該代碼而不是硬編碼unix路徑。

use File::Spec::Functions 'catfile'; 

my $path = catfile($os_specific_base_dir, 'pathtofile', 'name.extension'); 

如果你真的需要的地方硬編碼UNIX路徑,這確實似乎不是一個好主意,你應該使用File::Spec::Unix的路徑分成其組件,然後使用File::Spec變種,原產於要構建的目標系統將組件重新組合在一起。

+0

是的,我瞭解catfile以及如何使用它來生成操作系統特定的名稱。我以前用過這個。在這種情況下,我無法控制我得到的名字。我從某處已經設置了'$ path'。我只能在得到它後才能更改它(正如我在問題中提到的那樣)。 – Lazer 2010-10-12 07:03:49

+1

對。這就是爲什麼我在我的回答中提到了另一種處理方法。 – rafl 2010-10-12 07:05:35

1

你看的File::Spec核心模塊 - 以及相關的呢?

0

聽起來好像你將整個$路徑從別的地方作爲一個單元交給你,而不是單獨處理碎片。在這種情況下,如果我們在Windows下運行,我不會看到比用反斜槓替換所有斜線的醜陋解決方案更好的答案。

以下應該做你需要的東西:

if ($^O =~ /^MSWin/) { 
    $path =~ s{/}{\\}g; 
} 

編輯:關於第二個想法 - 已經採取看看文件::規格,它看起來像你想的canonpath功能:

use File::Spec; 
# ... 
$path = File::Spec->canonpath($path); 
相關問題