2010-07-12 62 views
1

我有一個非常簡單的perl腳本來移動文件(不要問爲什麼我不能使用cp,它的漫長,傷心,並會讓你哭)。我從命令行輸入2個輸入,dir1和dir2。然後我有一個內部文件列表,我將它們連接在一起。目錄輸入衛生

my $file = dir1 . filename 

只要用戶在他們的目錄中放入一個traling /就可以工作。但顯然如果他們不這樣做,它仍然將它連接爲/ my/awesome/folderFILE,而腳本失敗。

消毒用戶提供的目錄的最佳做法是什麼?

+0

爲什麼你不能使用CP?也許這與你的答案有關。 – mcandre 2010-07-12 16:49:52

+1

當然,有許多完全有效的以Perl爲中心的理由,當然不會在Perl的內置'File :: Copy'上使用'cp'。但我想聽到悲傷的故事! – DVK 2010-07-12 17:16:22

+0

我們在一個文件夾中有650萬張圖片。 (不是我的)做一個ls將最終吃掉所有的RAM和交換空間。一個cp -a可能會工作,但如果失敗了,我將無法恢復,我相信會比我的「opendir」perl腳本花費更長的時間,它可以在大約10秒內讀取所有600萬個文件。 – 2010-07-12 18:18:03

回答

3

雖然你可以像其他的答案提到的,正義的力量,加上結尾斜槓,它已經從導致雙斜線而產生一些小問題 - 從僅僅看平原難看,至少恕我直言,如果你打印結果文件名記錄;更糟糕的是,如果需要,所述日誌難以自動解析/處理。

在Perl更便攜,慣用的方法是使用文件構建路徑::規格:

use File::Spec; 
my $file = File::Spec::catfile($dir1,$filename); 

如果你喜歡使用一個模塊的東西,簡單就是有點核彈-the-飛的方式,使用正則表達式(so you can now have 2 problems!:)

$dir =~ s!([^/])$!$1/!; 

這種方法有教學設備的好處,以展示你不必使用正斜槓作爲正則表達式的分隔符。

此外,對您而言可能已經很明顯,但值得重新重複:切勿信任用戶輸入!

因此,在處理命令行參數時總是要做一些類似die "Not a directory: $dir1\n" unless -d $dir1;的操作。

0

只需在目錄路徑的尾部添加「/」即可。你的shell應該接受'/ my/awesome/folder // FILE',並將它解釋爲'/ my/awesome/folder/FILE'。

0
my $file = $dir1 . '/' . $filename 

/a/b//c的工作方式相同/a/b/c

0

可以轉換的要求,以「增加一個尾隨/的路徑,除非它已經有一個」從英語到Perl的相當直接,無需正則表達式:

$path .= '/' unless substr($path, -1) eq '/';