LINUX.ORG.RU

[perl]seekdir && telldir

 


0

1

Приветствую.

Необходимо получить список файлов директории, но показать только $show, и перед этим пропустить $skip.

Средствами telldir и seekdir не особо понятно, к примеру вывод readdir и telldir, для /etc:

Name: pam.d: 20056282
Name: audit: 30329143
Name: openldap: 38432171
Name: at.deny: 40855450
Name: aliases.db: 43156051
Name: kde: 54467097
Name: request-key.conf: 58798807
Name: gshadow: 60376581
Name: gssapi_mech.conf: 71882523
Name: DIR_COLORS: 74501124
Name: cron.d: 74939246
Name: PackageKit: 77092107
Name: passwdqc.conf: 80986832
Name: snmp: 90923701
Name: shadow: 98461953
А в идеале хотелось бы видеть 1, 2, 3... Пока что использую «костыль»:
        readdir FH for (1..$skip);
	for(my $i=0; $i<$show; $i++){
	    $_ = readdir FH;
             .....
У кого какие еще варианты ?

★★★★★

Последнее исправление: joy4eg (всего исправлений: 1)
Ответ на: комментарий от Hoodoo

$skip - Кол-во файлов, сколько нужно пропустить, при чтении каталога с начала.
$show - Кол-во файлов, которые необходимо показать.

joy4eg ★★★★★
() автор топика

> Необходимо получить список файлов директории

print «Name: $_\n» for grep { -f } </etc/*>;

arsi ★★★★★
()
Ответ на: комментарий от joy4eg
use warnings;
use strict;

my $dir_to_read = '.';
opendir SHOW, $dir_to_read or die "$!";
my @dir;
my $skip = 2;
my $show = 3;

foreach my $file (readdir SHOW) {
	next if $file eq '.' or $file eq '..';	
	push @dir, $file;
}

close SHOW;

print "@dir[$skip, ($skip+$show)]";
Hoodoo ★★★★★
()
Ответ на: комментарий от Hoodoo

Имена всех файлов записываются в память, что не особо хорошо. Если и делать таким способом , то лучше вариант arsi, т.е.

opendir(FH, '.') or die $!;
print "Name: $_\n" for grep { --$skip < 0 && $show-- > 0 } readdir FH;
joy4eg ★★★★★
() автор топика
Ответ на: комментарий от arsi

Благодарю, почти то, что нужно.

joy4eg ★★★★★
() автор топика
Ответ на: комментарий от Hoodoo
  • Используй glob'ы - смотри ответ arsi
  • У тебя две ошибки в коде: а) в список файлов попадают директории б) print «@dir[$skip, ($skip+$show)]» надо заменить на print «@dir[$skip..($skip+$show)]»

В общем, если хочешь использовать readir, то лучше как то так:

my @files = grep { -f "$dir/$_" } readdir SHOW;

bjorn
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.