Forum Webscript.Ru
Программирование => Perl => Тема начата: Отец Никон от 05 Февраля 2003, 22:21:05
-
1) Можно ли из папки прочитать только х+у файлов, где х-начальная позиция, а у-последняя? (Надо отобразить список тем форума.)
2) Как отсортировать массив этих прочитанных фалов по дате, алфавиту и пр.?
-
perldoc -f readdir
perldoc -f sort
-
+ perldoc -f stat :)
-
Это не ответы: все функции, которые вы назвали, мне известны.
Во-первых: readdir читает все фалы из директории. Мне этого не надо.
Во-вторых о sort. Как сделать сортировку по дате? Надо ли записать так: $a=stat, $b=stat и затем sort или как-то иначе.
-
Это не ответы:
Не функции должны быть известны, а что они делают должно быть известным.
Во-первых: readdir читает все фалы из директории.
Искуственный интеллект у этой функции отсутствует. Выбирай в массив и далее уже по индексам бери столько сколько нужно.
Во-вторых о sort. Как сделать сортировку по дате?
perldoc -f stat
получаешь из того же массива дату.
perldoc -f stat
Examples:
# sort lexically
@articles = sort @files;
# same thing, but with explicit sort routine
@articles = sort {$a cmp $b} @files;
# now case‐insensitively
@articles = sort {uc($a) cmp uc($b)} @files;
# same thing in reversed order
@articles = sort {$b cmp $a} @files;
# sort numerically ascending
@articles = sort {$a <=> $b} @files;
# sort numerically descending
@articles = sort {$b <=> $a} @files;
Переводить комментарии надеюсь не нужно?
Кстати, в данном случае я бы хэш использовал filename=>date.
-
Мне известно, естественно, что эти функции делают.
То, что из массива брать нужные индексы - это я допёр. Но, понимаешь, чем больше в папке файлов, тем дольше работает функция. Но, кажется, я нашёл решение...
По поводу sort - то, что ты процитировал - это, кажется, из справки по ПЕРЛу? Я только сегодня это читал.
Но, к сожалению, я опять не понял, как их по дате отсортировать... Можно пример?
-
@not_sorted = (2, 1, 67, 23, 15, 10);
@sorted = sort {$a <=> $b} @not_sorted;
print join "\\n", @sorted;
Смысл понятен?
-
Да, конечно. Смысл этого понятен. Но не это надо...
Я сам виноват, что не сформулировал чётко вопрос.
На экран выводятся темы сообщений форума. Названия тем и дата их последнего изменения содержатся в файлах. Вот как я это делаю (вообще-то, это не я, а из книги Р. Колбурна, но я много добавил в его код...):
@topics = grep (/^.+\\.txt$/, readdir (TOPICS));
...
&parse_topic;
...
print "$page_title | \\n";
...
Здесь $page_title - заголовок темы.
Теперь процедура расшифровки файла.
sub parse_topic {
$topic_file = "$forums_path/$forum/" . $topic . ".txt";
eval {
open (TOPIC, "< $topic_file")
or die "Can\'t open $topic_file";
@topic_text = ;
};
$topic_text = join \'\', @topic_text;
# Extract the topic title from the topic
if ($topic_text =~ /(.*)<\\/title>/s) {
$page_title = $1;
}
else {
$err = "title";
return undef;
}
# Extract the author from the topic
if ($topic_text =~ /(.*)<\\/author>/s) {
$topic_author = $1;
}
else {
$err = "author";
return undef;
}
# Extract the date when the file was last modified
if ($topic_text =~ /(.*)<\\/last_modified>/s) {
$last_modified = $1;
}
else {
$err = "lastmod";
return undef;
}
Ты видишь, NeoNox, что и дата изменения и заголовок темы извлекаются из одного файла, и, замечу, не пишутся в массив, а всё время представлены одними и теми же переменными. Значит, чтобы отсортировать по алфавиту, дате и тп. надо соответственно отсортировать массив @topics. Понимаешь теперь?
-
отсортировать массив @topics.
Enjoy!
# $field - по какому параметру сортировать
# @topics - не отсортированные топики >> @sorted
# <=> или cmp - в зависимости от типа
my $field = "last_modified";
my @sorted = sort { get_field($b, $field) <=> get_field($a, $field) } @topics;
sub get_field {
my ($topic, $field) = @_;
my $topic_file = "$forums_path/$forum/" . $topic . ".txt";
open (TOPIC, $topic_file) or die "Can\'t open $topic_file";
$/ = undef;
my $topic_text = ;
my $res = $topic_text =~ /<$field>(.*)<\\/$field>/s ? $1 : undef;
return $res;
}
-
readdir читает все фалы из директории
Это в списковом констексте. А в скалярном возвращает очередное имя файла. А с помощью seekdir мона двигаться по каталогу на нужную позицию, не читая содержимое каталога целиком.
Т.е.
opendir (dir, "каталог");
seekdir dir, $x;
for ($a=0; $a < ($y-$x); $a++){ $dir[$a] = readdir (dir) }
closedir dir;
и у тебя список файлов с x по y
При условии, что ты знаешь в какой последовательности у тебя файлы читаются readdir\'ом (лично я единства в этом на разных системах не заметил)