28

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

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

4

9 に答える 9

66

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

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

opendir my($dh), $dirname or die "Couldn't open dir '$dirname': $!";
my @files = readdir $dh;
closedir $dh;
#print files...
于 2008-10-15T15:28:45.267 に答える
12

他の誰もが質問の実行部分に行き詰まっているようです。

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

于 2008-10-15T21:49:31.647 に答える
8

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

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

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

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

于 2008-10-15T15:31:15.153 に答える
6

Perl グロビングを使用します。

my $dir = </dir/path/*> 
于 2011-07-05T18:45:20.870 に答える
6

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

$listing = `ls`;

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

于 2008-10-15T15:27:39.217 に答える
5

さらに別の例:

chdir $dir or die "Cannot chroot to $dir: $!\n";
my @files = glob("*.txt");
于 2010-07-29T10:29:25.193 に答える
5

編集:おっと!ディレクトリのリストが欲しいだけだと思っていました...「ディレクトリ」呼び出しを削除して、このスクリプトを希望どおりに実行させてください...

私の意見では、ファイルハンドルで遊ぶのは間違った方法です。以下は、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);
于 2010-08-11T13:31:35.993 に答える
0

Linuxでは、私は次のものを見つけることを好みます。

my @files = map { chomp; $_ } `find`;
于 2008-10-17T01:30:10.903 に答える
0

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

于 2008-10-15T17:22:53.663 に答える