Как я могу создать массив содержимого каталога в Perl? - PullRequest
1 голос
/ 18 января 2010

Мне нужно сделать 3 массива из содержимого $directory.Первый, который я могу использовать:

$var = qx{ls $directory};
print $var;

Однако, второй и третий я хочу использовать grep для "Primary *" и "Secondary *"

Я использовал команды:

my @primary = 0;
my @secondary = 0;

@primary = system("ls test_77 > test | grep Primary* test");
print @primary;
@secondary = system("ls test_77 > test | grep Secondary* test");
print @secondary;

НО, на выходе он содержит ноль:

PrimaryCPE_Option_A.txt.test_77
PrimaryCPE_Option_B.txt.test_77
0SecondaryCPE_Option_A.txt.test_77
SecondaryCPE_Option_B.txt.test_77
0

Что это может быть?Сначала это выглядит так, как будто это может быть исходный ноль, но я могу изменить начальное значение любого из них, и оно не работает.

Ответы [ 4 ]

3 голосов
/ 18 января 2010

Perl может сделать это без вызова системных команд.

@secondary=glob("*Secondary*.txt");
print @secondary;
@primary=glob("*Primary*.txt")
print @primary;

Другие способы используют opendir () / readdir () или цикл while, например,

while(my $file=<*Primary*txt>){
  push(@secondary,$file);
}

Или

push (@secondary,$_) while<*Secondary*.txt> ;
3 голосов
/ 18 января 2010

Следующие будут читать все файлы в текущем каталоге, и хранить их в одном массиве. Исключает подкаталоги, но включает файлы, которые начинаются с символа .. Затем он создает 2 других массива из 1-го массива. См. Файл :: Slurp .

use strict;
use warnings;
use File::Slurp qw(read_dir);

my @all_files = grep { -f $_ } read_dir('./');
my @pfiles = grep {/^Primary/  } @all_files;
my @sfiles = grep {/^Secondary/} @all_files;

Я постараюсь ответить на ваши вопросы сейчас. system возвращает состояние выхода внешней команды (например, ls). Не возвращает список каталогов. Вы должны использовать qx для возврата списка каталогов. См. system .

Таким образом, поскольку ваша команда ls успешно выполняется, ее состояние выхода равно 0. Таким образом, system возвращает 0. Это значение сохраняется в 1-м элементе вашего массива. Это единственное значение в вашем массиве. Любой другой вывод, который вы видите, исходит от вашего grep, я считаю.

Кроме того, единственный способ приблизиться к воспроизведению ваших выходных данных - изменить канал на точку с запятой в вашем вызове system и избавиться от *:

@primary = system("ls test_77 > test ; grep Primary test");
1 голос
/ 18 января 2010

Вот как бы я написал эту программу:

#! /usr/bin/env perl
use strict;
use warnings;
use autodie;  # this is so that you don't have to check opendir(), and readdir().

my @files = grep {
  -f $_;
} do{
  opendir my $dir, '.';
  readdir $dir;
};

my @primary   = grep {/Primary/  } @files;
my @secondary = grep {/Secondary/} @files;

Вы помещаете 0 в список, объявляя массивы следующим образом:

my @primary = 0;

Если вам нужен пустой массив, вы просто объявляете его.

my @primary;

Если вы хотите явно установить массив в ничто:

@primary = ();
0 голосов
/ 18 января 2010

Я думаю, вы должны использовать opendir readdir и т.делать все это в процессе, используя стандартные встроенные команды.Результаты немедленно возвращаются в виде массива для дальнейшей обработки с использованием регулярных выражений Perl.

(Обратите внимание, что вам нужно экранировать * в вашем grep, если вы продолжите свой подход.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...