ls
CGI スクリプトの一部として Perl プログラムで実行したいと考えています。これには を使用しましたが、これは呼び出し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 プログラムに戻しません。 システムはそうしますが、ls の結果を返さず、ステータス コードを返します。目盛り``を使用すると、コマンドの出力が得られますが、安全ではないと見なされる人もいます。
組み込みの dir 関数を使用します。opendir、readdir など。
Perl グロビングを使用します。
my $dir = </dir/path/*>
システム コマンドの出力を取得するには、バッククォートを使用する必要があります。
$listing = `ls`;
ただし、Perl はそれ自体でディレクトリを処理するのに適しています。File::Find::Rule を使用することをお勧めします。
さらに別の例:
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);
Linuxでは、私は次のものを見つけることを好みます。
my @files = map { chomp; $_ } `find`;
IPC::Open3をご覧になることをお勧めします。システムやバックティックよりも、生成されたプロセスをはるかに細かく制御できます。