2008-10-15 49 views

回答

61

Exec根本不返回。如果你想這樣做,請使用系統。

如果你只是想讀取一個目錄,打開/ read/close-dir可能會更合適。

opendir my($dh), $dirname or die "Couldn't open dir '$dirname': $!"; 
my @files = readdir $dh; 
closedir $dh; 
#print files... 
+2

檢查系統的返回值命令:執行opendir ...或死亡 「... $!」 或「使用autodie;」讓他們在默認情況下致命。 我知道這只是一個挑逗,但是當你給初學者提供建議時,這對他們來說是一個重要的教訓。 – tsee 2008-10-15 16:26:05

+0

是的,你說得對,我會添加它。謝謝。 – 2008-10-15 17:29:31

+0

如果有人想知道爲什麼不檢查readdir和closedir:兩者都只有一個可能的錯誤,'無效的目錄句柄'。由於我自己打開並檢查它,我可以放心地認爲它是有效的。另外,在列表上下文中,無論如何都不能檢查readddir。 – 2008-10-15 17:43:26

6

爲了獲得系統命令的輸出,您需要使用反引號。

$listing = `ls`; 

但是,Perl很擅長處理目錄本身。我建議使用File :: Find :: Rule。

0

我建議你看看IPC::Open3。它比系統或反引號可以更好地控制產生的進程。

12

其他人似乎都停留在問​​題的執行部分。

如果您想要目錄列表,請使用Perl內置的globopendir。你不需要一個單獨的過程。

0

在Linux上,我更喜歡看到:

my @files = map { chomp; $_ } `find`; 
5

另一個例子:

chdir $dir or die "Cannot chroot to $dir: $!\n"; 
my @files = glob("*.txt"); 
5

編輯:哎呀!我以爲你只是想要目錄的清單...刪除'目錄'電話,使這個劇本做你想做的事...

玩文件句柄是在我看來是錯誤的方式。以下是使用File :: Find :: Rule查找指定目錄中所有目錄的示例。它可能看起來像是在爲你正在做的事情而殺人,但是後來它可能是值得的。

首先,我的一個在線解決方案:

File::Find::Rule->maxdepth(1)->directory->in($base_dir); 

現在更抽出版本註釋。如果你安裝了File :: Find :: Rule,你應該可以運行這個沒問題的。不要害怕CPAN。

#!/usr/bin/perl 

use strict; 
use warnings; 

# See http://search.cpan.org/~rclamp/File-Find-Rule-0.32/README 
use File::Find::Rule; 

# If a base directory was not past to the script, assume current working director 
my $base_dir = shift // '.'; 
my $find_rule = File::Find::Rule->new; 

# Do not descend past the first level 
$find_rule->maxdepth(1); 

# Only return directories 
$find_rule->directory; 

# Apply the rule and retrieve the subdirectories 
my @sub_dirs = $find_rule->in($base_dir); 

# Print out the name of each directory on its own line 
print join("\n", @sub_dirs); 
6

使用Perl通配:

my $dir = </dir/path/*>