2015-03-31 26 views
1

我使用perl根據cygwin。這是我想要做的。我想列出一個目錄下的所有文件夾到一個數組中,然後以字符串形式打印出來,以便得到以下結果。如何在perl之後刪除ls後的換行符?

讓,工作路徑是/user/。在路徑內
文件夾爲:

/user/A 
/user/B 
/user/C 

我想:

perl foo 
/user/A /user/B /user/C 

我有以下代碼:

my @folderList = `ls /user`; 
foreach (@folderList) { 
    print "$_ "; 
} 
print "\n"; 

,結果是:

$ perl foo 
/user/A 
/user/B 
/user/C 
$ 

我的問題
如何刪除存儲在數組內的每個結果的換行符?我試過chop()去除最後一個字符,但它不工作。

+0

對不起,我修復了代碼。由於我原來的功能有點複雜,所以我只是弄清楚它的一部分,這樣我就可以更容易地逐步解決我的問題了〜「〜 – sflee 2015-03-31 02:30:38

+1

好的,所以......如果我把'chop'在循環中,在'print'$ _「;'之前,你的代碼適用於我,我已經給出了你應該寫的東西的答案,但是我想明白爲什麼'chop'不適合你。你究竟是怎麼使用它的? – zwol 2015-03-31 02:45:11

+0

@zwol'chop'將刪除字符串中的最後一個字符,不管它是什麼。除了明顯的問題,Windows使用兩個字符作爲換行符,所以它是不可移植的。我不確定Cygwin命令使用什麼,可能是單個字符Unix新行。 – Schwern 2015-03-31 03:43:54

回答

4

簡單的答案是使用chomp,這將從$string@strings剝去換行符。

但是你的實現有一些問題。最大的是使用系統命令如catls來完成Perl已經可以做的事情。在可能的情況下,你應該避免使用系統命令,因爲它通常比較慢(實際上命令通常比Perl速度快,但是執行工作的開銷比較慢),不可移植(如果你沒有讓Cygwin代碼贏得'在Windows上工作),不安全(用戶很容易將shell代碼注入到你認爲只是一個文件名中),更難以檢查錯誤(你需要刮掉STDERR輸出而不是讀取$!),並且你永遠不會知道如果你得到BSD或GNU版本(像查找這樣的特定問題)。

改爲使用opendir,readdiropen等函數來讀取文件和目錄。

更好的是,使用Path::Tiny模塊,它爲您處理大多數文件操作。並且它也會檢查錯誤,並且無處不在地灑落着or die $!

use v5.10; 
use strict; 
use warnings; 
use Path::Tiny; 

my $dir = path("/user"); 

for my $subdir ($dir->children) { 
    say $subdir->absolute; 
} 
1

chomp是要走的路 - 你可以做這樣的事情:

my @folderList = `find user -mindepth 1`; 

foreach (@folderList) { 
    chomp $_; 
    print "$_ "; 
} 
print "\n"; 

注:你可能要改變「find user -mindepth 1」到適合您需要的unix命令

+0

我相信你的意思是'-maxdepth'。 – zwol 2015-03-31 02:40:02

+0

如果你打算使用'$ _'(並且你不應該,你應該使用'foreach my $ dir'),那麼你也可以利用它來寫'chomp;'和'print;'。或者只是'chomp @ folderList'並將其從循環中取出。 – Schwern 2015-03-31 03:05:34

+1

@Schwern - 酷!謝謝你的提示 :) – csiu 2015-03-31 03:20:34

1

如果我正確理解你的目標,

perl -MCwd -le 'print join " ", glob getcwd. "/*"' 

或更多規範

use Cwd; 
print(join(" ", glob(getcwd() . "/*"), "\n")); 

是你寫的應該有的程序。這通過使用內置Perl函數glob和標準庫函數Cwd::getcwd來繞過整個問題來執行目錄掃描,而不是調用子進程。 (作爲一個經驗法則,如果你可以做一些事情,而不必調用子進程,你應該做沒有調用子進程,你會當您遇到此規則的例外知道。)

你可以循環在glob的輸出上,但使用join代替表示沒有尾隨空格。