Perlでディレクトリリストを取得するにはどうすればよいですか? [複製]
質問
この質問にはすでに回答があります:
- ディレクトリの内容の読み方Perlでですか? 8つの答え
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...
他のヒント
他の全員が質問のexec部分にこだわっているようです。
ディレクトリのリストが必要な場合は、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 :: Open3 をご覧になることをお勧めします。生成されたプロセスを、システムやバックティックよりもはるかに制御できます。
Linuxでは、次のものを見つけます:
my @files = map { chomp; Linuxでは、次のものを見つけます:
<*> } `find`;