информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применениеАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
С твоим кодом не стал разбираться - написал свой: 21.02.05 04:43  Число просмотров: 1750
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
С твоим кодом не стал разбираться - написал свой:

unlink "$tp.top";
for ($tp++;-e "$tp.top";$tp++) {
rename "$tp.top", ($tp-1).".top";
}

Сам не проверял, но должно работать. Как ты понял, я задействовал только одну переменную $tp, да ещё в предположении, что все файлы находятся в текущей директории - это уже сам поправишь.
<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 - её можно использовать для универсальной проверки того, что имя файла имеет действительно нужный формат.

Вот. Вроде исчерпывающе :-)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach