CGIスクリプトの一部としてPerlプログラムでls
を実行したいと思います。このためにexec(ls)
を使用しましたが、これはexec
呼び出しから戻りません。
Perlでディレクトリのリストを取得するより良い方法はありますか?
Execはまったく戻りません。それが必要な場合は、システムを使用してください。
ディレクトリを読みたいだけなら、open/read/close-dirがより適切かもしれません。
opendir my($dh), $dirname or die "Couldn't open dir '$dirname': $!";
my @files = readdir $dh;
closedir $dh;
#print files...
他の誰もが質問の実行部分にこだわっているようです。
ディレクトリのリストが必要な場合は、Perlの組み込みglob
またはopendir
を使用します。別のプロセスは必要ありません。
execは、Perlプログラムに制御を戻しません。 systemは、lsの結果を返さず、ステータスコードを返します。目盛り ``はコマンドの出力を提供しますが、安全でないと見なされる人もいます。
組み込みのdir関数を使用します。 opendir、readdirなど。
システムコマンドの出力を取得するには、バックティックを使用する必要があります。
$listing = `ls`;
ただし、Perlはディレクトリ自体を処理するのに適しています。 File :: Find :: Ruleを使用することをお勧めします。
Perl Globbingを使用します。
my $dir = </dir/path/*>
さらに別の例:
chdir $dir or die "Cannot chroot to $dir: $!\n";
my @files = glob("*.txt");
編集:おっと!ディレクトリのリストが欲しいだけだと思っていました...このスクリプトにあなたが望むことをさせるために「ディレクトリ」呼び出しを削除してください...
私の意見では、ファイルハンドルで遊ぶのは間違った方法です。 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);
IPC :: Open をご覧になることをお勧めします。システムまたはバックティックよりも、生成されたプロセスをはるかに制御できます。
Linuxでは、私は見つけることを好む:
my @files = map { chomp; $_ } `find`;