Как я читаю в содержании каталога в Perl?

Если вы не хотите использовать карту, просто выполните следующие шаги:

  1. Сортируйте массив (используя Arrays.sort())
  2. Используйте переменную, чтобы удерживайте самый популярный элемент (mostPopular), переменную для хранения своего количества вхождений в массиве (mostPopularCount) и переменную, чтобы удерживать количество вхождений текущего числа в итерации (currentCount)
  3. Итерации через массив. Если текущий элемент совпадает с mostPopular, увеличьте currentCount. Если нет, сбросьте currentCount на 1. Если currentCount> mostPopularCount, установите mostPopularCount в currentCount и mostPopular для текущего элемента.
38
задан Peter Mortensen 8 January 2014 в 11:57
поделиться

7 ответов

opendir(D, "/path/to/directory") || die "Can't open directory: $!\n";
while (my $f = readdir(D)) {
    print "\$f = $f\n";
}
closedir(D);

Править: О, извините, пропущенный "в массив" часть:

my $d = shift;

opendir(D, "$d") || die "Can't open directory $d: $!\n";
my @list = readdir(D);
closedir(D);

foreach my $f (@list) {
    print "\$f = $f\n";
}

EDIT2: большинство других ответов действительно, но я хотел прокомментировать этот ответ а именно, в котором предлагается это решение:

opendir(DIR, $somedir) || die "Can't open directory $somedir: $!";
@dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR);
closedir DIR;

Во-первых, к документу, что это делает, так как плакат не сделал: это передает возвращенный список от readdir () через grep (), который только возвращает те значения, которые являются файлами (в противоположность каталогам, устройствам, именованным каналам, и т.д.) и которые не начинаются с точки (который делает имя списка @dots при введении в заблуждение, но это происходит из-за изменения, которое он внес при копировании его с readdir () документация). Так как это ограничивает содержание каталога, который это возвращает, я не думаю, что это - технически корректный ответ на этот вопрос, но это иллюстрирует, что общая идиома раньше фильтровала имена файлов в Perl, и я думал, что это будет ценно к документу. Другой пример, замеченный, много:

@list = grep !/^\.\.?$/, readdir(D);

Этот отрывок читает все содержание из дескриптора каталога D кроме'.' и '..', так как это очень редко желаемо, чтобы использоваться в списке.

55
ответ дан Community 27 November 2019 в 03:19
поделиться

Быстрое и грязное решение состоит в том, чтобы использовать шарик

@files = glob ('/path/to/dir/*');
13
ответ дан Pat 27 November 2019 в 03:19
поделиться

IO:: Dir хорош и обеспечивает связанный интерфейс хеша также.

От perldoc:

use IO::Dir;
$d = IO::Dir->new(".");
if (defined $d) {
    while (defined($_ = $d->read)) { something($_); }
    $d->rewind;
    while (defined($_ = $d->read)) { something_else($_); }
    undef $d;
}

tie %dir, 'IO::Dir', ".";
foreach (keys %dir) {
    print $_, " " , $dir{$_}->size,"\n";
}

Таким образом, Вы могли сделать что-то как:

tie %dir, 'IO::Dir', $directory_name;
my @dirs = keys %dir;
8
ответ дан Chankey Pathak 27 November 2019 в 03:19
поделиться

Это сделает это, в одной строке (отметьте '*' подстановочный знак в конце)

@files = </path/to/directory/*>;
# To demonstrate:
print join(", ", @files);
7
ответ дан rix0rrr 27 November 2019 в 03:19
поделиться

Вы могли использовать DirHandle:

use DirHandle;
$d = new DirHandle ".";
if (defined $d)
{
    while (defined($_ = $d->read)) { something($_); }
    $d->rewind;
    while (defined($_ = $d->read)) { something_else($_); }
    undef $d;
}

DirHandle обеспечивает альтернативу, более чистый интерфейс к opendir(), closedir(), readdir(), и rewinddir() функции.

5
ответ дан serenesat 27 November 2019 в 03:19
поделиться

Вот пример рекурсивного вызова через структуру каталогов и копирования резервного сценария формы файлов, который я записал.

sub copy_directory {
my ($source, $dest) = @_;
my $start = time;

# get the contents of the directory.
opendir(D, $source);
my @f = readdir(D);
closedir(D);

# recurse through the directory structure and copy files.
foreach my $file (@f) {
    # Setup the full path to the source and dest files.
    my $filename = $source . "\\" . $file;
    my $destfile = $dest . "\\" . $file;

    # get the file info for the 2 files.
    my $sourceInfo = stat( $filename );
    my $destInfo = stat( $destfile );

    # make sure the destinatin directory exists.
    mkdir( $dest, 0777 );

    if ($file eq '.' || $file eq '..') {
    } elsif (-d $filename) { # if it's a directory then recurse into it.
        #print "entering $filename\n";
        copy_directory($filename, $destfile); 
    } else { 
        # Only backup the file if it has been created/modified since the last backup 
        if( (not -e $destfile) || ($sourceInfo->mtime > $destInfo->mtime ) ) {
            #print $filename . " -> " . $destfile . "\n";
            copy( $filename, $destfile ) or print "Error copying $filename: $!\n";
        } 
    } 
}

print "$source copied in " . (time - $start) . " seconds.\n";       
}
1
ответ дан Mickey 27 November 2019 в 03:19
поделиться

Подобный вышеупомянутому, но я думаю, что лучшая версия (немного изменена) от "perldoc-f readdir":

opendir(DIR, $somedir) || die "can't opendir $somedir: $!";
@dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR);
closedir DIR;
2
ответ дан trjh 27 November 2019 в 03:19
поделиться
Другие вопросы по тегам:

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