unlink "$tp.top";
for ($tp++;-e "$tp.top";$tp++) {
rename "$tp.top", ($tp-1).".top";
}
Сам не проверял, но должно работать. Как ты понял, я задействовал только одну переменную $tp, да ещё в предположении, что все файлы находятся в текущей директории - это уже сам поправишь.
В моём самописном форуме темы хранятся в отдельных файлах вида "1.top". Все пронумерованы и выводятся по порядку. Поэтому при удалении, допустим, третьей темы при наличии четырёх, исчезает и четвертая. Поэтому при удалении надо переименовывать "4.top" на "3.top"
Написал такой код:
unlink "sects/$secn/$tp.top"; #в переменной $tp указан номер удаляемого топа
opendir SD, "sects/$secn";
@at=readdir SD;
closedir SD;
foreach $top (@at)
{
if (($top ne ".") and ($top ne ".."))
{
$num = grep($top, ".top");
if ($num>$tp)
{
$num--;
rename "sects/$secn/$top", "sects/$secn/$num.top";
}
}
}
---
Но он почему-то не работает. Вообще не даёт никакого эффекта. Подскажите, пожалуйста, в чём я ошибся тут.
С твоим кодом не стал разбираться - написал свой:21.02.05 04:43 Автор: Heller <Heller> Статус: Elderman
unlink "$tp.top";
for ($tp++;-e "$tp.top";$tp++) {
rename "$tp.top", ($tp-1).".top";
}
Сам не проверял, но должно работать. Как ты понял, я задействовал только одну переменную $tp, да ещё в предположении, что все файлы находятся в текущей директории - это уже сам поправишь.
Спасибо, теперь всё работает ;)21.02.05 06:07 Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
$num = grep($top, ".top"); - что делает эта строка? Имхо, именно в ней ошибка.
Синтаксис grep'а:
grep BLOCK LIST
grep EXPR,LIST
Возращает он в качестве результата "подсписок" списка LIST, состоящий из элементов LIST, для которых EXPR является истиной (либо истину возвращает последняя функция блока). Назначение grep в твоём случае я не понял.
Вроде бы, как я понял, ты пытался отрезать таким образом расширение. Даже если бы функция типа той, которую ты привёл, существовала, в программе крылась бы серьёзная ошибка.
Допустим, в директории появился ещё один файл с совершенно другим именем. Что произойдёт, если имя файла не будет иметь расширения ".top" - я не знаю, поскольку "noxi0uzz grep" нам пока не известен ;). Видимо, ничего хорошего. А вот если файл будет иметь расширение .top, но не числовое значение, то тогда могут получиться нехорошие последствия.
$num>$tp и $num-- нормально пройдут, синтаксис это позволяет, но тогда есть большая вероятность того, что в $num в итоге обнаружатся символы, который недопустимы как имя файла (-- работает так:("ccc"--)=="ccb", если не ошибаюсь).
Вырезать число из имени файла следовало бы следующим образом:
$top=~s/\.top//;
При этом всё равно все указанные выше ошибки остаются в силе. Что бы вырезалось действительно число, делать это надо бы так:
$top=~/^(\d+)\.top$/;
"Номер файла" при этом окажется в переменной $1 (читай perlfaq6). Эта же строка является условием, т. е. возвращает true/false - её можно использовать для универсальной проверки того, что имя файла имеет действительно нужный формат.