Как я получаю список каталогов в Perl? [дубликат]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

28
задан Peter Mortensen 9 January 2014 в 08:38
поделиться

9 ответов

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 28 November 2019 в 02:18
поделиться

На Linux я предпочитаю, найдите:

my @files = map { chomp; $_ } `find`;
0
ответ дан JDrago 28 November 2019 в 02:18
поделиться

Все остальные кажутся застрявшими на исполнительной части вопроса.

, Если Вы хотите список каталогов, используйте Perl, встроенный glob или opendir. Вам не нужен отдельный процесс.

12
ответ дан brian d foy 28 November 2019 в 02:18
поделиться

Для получения, вывод системы управляют, чтобы Вы использовали обратные галочки.

$listing = `ls`;

Однако Perl хорош имея дело с каталогами для себя. Я рекомендовал бы использовать File::Find::Rule.

6
ответ дан holli 28 November 2019 в 02:18
поделиться

exec не возвращает управление программе Perl. Система будет, но она не возвращает результаты ls, она возвращает код состояния. отметки `` приведут вас к выводу нашей команды, но некоторые считают ее небезопасной.

Используйте встроенные функции DIR. opendir, readdir и т. д.

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

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

8
ответ дан J.J. 28 November 2019 в 02:18
поделиться

РЕДАКТИРОВАТЬ: Упс! Я думал, что вы просто хотели получить список каталогов ... удалите вызов 'directory', чтобы заставить этот скрипт делать то, что вы хотите ...

Играть с файловыми дескрипторами - неправильный путь, по моему мнению , Ниже приведен пример использования File :: Find :: Rule для поиска всех каталогов в указанном каталоге. Это может показаться чрезмерным убийством за то, что вы делаете, но позже это может стоить того.

Во-первых, мое однострочное решение:

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 28 November 2019 в 02:18
поделиться

Используйте Perl Globbing:

my $dir = </dir/path/*> 
6
ответ дан sarnold 28 November 2019 в 02:18
поделиться

Я рекомендовал бы взглянуть на IPC:: Open3. Это допускает намного больше управления порожденным процессом, чем система или обратные галочки делают.

0
ответ дан dsm 28 November 2019 в 02:18
поделиться

Еще один пример:

chdir $dir or die "Cannot chroot to $dir: $!\n";
my @files = glob("*.txt");
5
ответ дан 28 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: