Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Exec не возвращается вообще. Если вы этого хотели, используйте систему.
Если вы просто хотите прочитать каталог, лучше подойдет open / read / close-dir.
opendir my($dh), $dirname or die "Couldn't open dir '$dirname': $!";
my @files = readdir $dh;
closedir $dh;
#print files...
На Linux я предпочитаю, найдите:
my @files = map { chomp; $_ } `find`;
Все остальные кажутся застрявшими на исполнительной части вопроса.
, Если Вы хотите список каталогов, используйте Perl, встроенный glob
или opendir
. Вам не нужен отдельный процесс.
Для получения, вывод системы управляют, чтобы Вы использовали обратные галочки.
$listing = `ls`;
Однако Perl хорош имея дело с каталогами для себя. Я рекомендовал бы использовать File::Find::Rule.
exec не возвращает управление программе Perl. Система будет, но она не возвращает результаты ls, она возвращает код состояния. отметки `` приведут вас к выводу нашей команды, но некоторые считают ее небезопасной.
Используйте встроенные функции DIR. opendir, readdir и т. д.
РЕДАКТИРОВАТЬ: Упс! Я думал, что вы просто хотели получить список каталогов ... удалите вызов '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);
Используйте Perl Globbing:
my $dir = </dir/path/*>
Я рекомендовал бы взглянуть на IPC:: Open3. Это допускает намного больше управления порожденным процессом, чем система или обратные галочки делают.
Еще один пример:
chdir $dir or die "Cannot chroot to $dir: $!\n";
my @files = glob("*.txt");