web-dev-qa-db-ja.com

Perlでディレクトリ一覧を取得するにはどうすればよいですか?

CGIスクリプトの一部としてPerlプログラムでlsを実行したいと思います。このためにexec(ls)を使用しましたが、これはexec呼び出しから戻りません。

Perlでディレクトリのリストを取得するより良い方法はありますか?

28
user28280

Execはまったく戻りません。それが必要な場合は、システムを使用してください。

ディレクトリを読みたいだけなら、open/read/close-dirがより適切かもしれません。

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

他の誰もが質問の実行部分にこだわっているようです。

ディレクトリのリストが必要な場合は、Perlの組み込みglobまたはopendirを使用します。別のプロセスは必要ありません。

12
brian d foy

execは、Perlプログラムに制御を戻しません。 systemは、lsの結果を返さず、ステータスコードを返します。目盛り ``はコマンドの出力を提供しますが、安全でないと見なされる人もいます。

組み込みのdir関数を使用します。 opendir、readdirなど。

http://perldoc.Perl.org/functions/opendir.html

http://perldoc.Perl.org/functions/readdir.html

8
J.J.

システムコマンドの出力を取得するには、バックティックを使用する必要があります。

$listing = `ls`;

ただし、Perlはディレクトリ自体を処理するのに適しています。 File :: Find :: Ruleを使用することをお勧めします。

6
holli

Perl Globbingを使用します。

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

さらに別の例:

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

編集:おっと!ディレクトリのリストが欲しいだけだと思っていました...このスクリプトにあなたが望むことをさせるために「ディレクトリ」呼び出しを削除してください...

私の意見では、ファイルハンドルで遊ぶのは間違った方法です。 File :: Find :: Ruleを使用して、指定したディレクトリ内のすべてのディレクトリを検索する例を次に示します。あなたがしていることのために過剰殺害のように思えるかもしれませんが、後でそれは価値があるかもしれません。

まず、私の1行のソリューション:

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);
5
Octoberdan

IPC :: Open をご覧になることをお勧めします。システムまたはバックティックよりも、生成されたプロセスをはるかに制御できます。

0
dsm

Linuxでは、私は見つけることを好む:

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