Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
Спасибо, теперь всё работает ;) 21.02.05 06:07 Число просмотров: 1629
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
|
Правда, всё ещё интересно, почему не работает мой код, но это уже неважно :).
|
<programming>
|
[Perl] Удаление файла с последующим переименованием остальных 21.02.05 03:40
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
|
В моём самописном форуме темы хранятся в отдельных файлах вида "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
|
Правда, всё ещё интересно, почему не работает мой код, но это уже неважно :).
|
| | |
Можно попробовать разобраться 21.02.05 08:09
Автор: Heller <Heller> Статус: Elderman
|
$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 - её можно использовать для универсальной проверки того, что имя файла имеет действительно нужный формат.
Вот. Вроде исчерпывающе :-)
|
|
|