2015-01-06 2 views
1

У меня есть необходимость очистки каталога с миллионами файлов журнала на моем веб-сервере. И я нашел this great article о том, как это сделать. . Существует, однако, пара интересных вещей в этом однострочника, которые я заинтересован вБыстрая очистка каталога с помощью Perl

Вот код Perl Я заинтересован в:

for(<*>){((stat)[9]<(unlink))} 

с запущенной perl -e 'code'.

Итак, вот мои вопросы:

  1. for(<*>) строительство - Я предполагаю, что перебирает файлы в текущем каталоге. Но где он хранит итератор?
  2. stat и unlink функции ожидают хотя бы одного аргумента, я предполагаю ... Но где это?
  3. Почему результат звонка (stat)[9] сравнивается с результатом звонка (unlink)? И к чему это приводит?

Извините, я не являюсь перли-иш, поэтому я не понимаю всех этих аббревиатур Perl. Вот почему я задаю этот вопрос.

Спасибо!

+0

* Я не человек-perl-ish * Я не думаю, что авторы статьи действительно есть. Это выглядит как строка кода, переданная от одного администратора к другому, который немного искалечен на этом пути. – Degustaf

ответ

3

Это один лайнер занимает много ярлыков:

  1. <*> является частным случаем оператора алмаза. Вы не можете получить доступ к объекту итератора, как на других языках. Здесь он вызывает функцию glob. В контексте списка он возвращает список из всех результатов (которые являются либо строками файла, либо, как в вашем случае, содержимым директивы. Возвращаемое значение этого значения передается в for, который выполняет итерацию по списку и псевдонизирует значения в $_. $_ является «переменной по умолчанию» для многих функций ...
  2. Что приводит нас здесь. Многие основные функции по умолчанию $_ без аргумента. Так что unlink и stat.
  3. (stat)[9] средство выполнения stat в контексте списка и выберите 10-й результат (индексы начинаются с нуля, это время изменения).(сравните это с доступом к массиву, например $foo[9]).
+0

Ничего! И что это за результат вызова 'unlink'? Почему он сравнивается с' stat [9] '??? – shybovycha

+0

Я не вижу причин для этого, отменив либо возврат' 1', либо ложное значение, в зависимости от Успех. Может быть, это очень короткий путь для выполнения обеих команд, но ';' должен быть таким же кратким. –

+3

Использование 'stat' в void-контексте также полностью избыточно. Если бы было сравнение даты модификации, это имело бы смысл. Это просто удалит все файлы. Можно также заменить это на 'unlink <*>' – TLP

1
  1. для (< *>) строительство - Я предполагаю, что перебирает файлы в текущем каталоге. Но где он хранит итератор?

для петель можно использовать для перебора массивов/списков, так что если <*> создает список, то ваш код просто заурядный для цикла. Как выясняется, <*> - это еще один способ заклинания glob(), который похож на регулярное выражение для извлечения имен файлов, а glob() возвращает список в контекст списка --which является контекстом для цикла цикла. См .: http://perldoc.perl.org/functions/glob.html.

Обратите внимание, что одинарные кавычки не позволяют оболочке расширять *, что помешало бы перлу видеть его.

+0

Оболочка не будет интерполировать '*'. – TLP

+0

@TLP, я неосведомлен. :( – 7stud

3

Код

for(<*>){((stat)[9]<(unlink))} 

эквивалентно:

for my $file (<*>) { 
    my $mtime = (stat($file))[9]; 
    $mtime < unlink($file); 
} 

<*> также может быть заменен glob "*", который может быть более удобным для чтения.

Код удалит все файлы в текущем каталоге. Он не будет удалять каталоги.

Обратите внимание, что последнее утверждение в цикле является полностью избыточным. Если use warnings в действительности, это даст предупреждение:

Useless use of numeric lt (<) in void context 

Для этого кода, чтобы понять, я бы ожидать сравнения, что на самом деле имеет значение, как сравнение $mtime на некоторое время, чтобы знать, какие журналы старые, например:

if ($mtime < $oldtime) { 
    unlink $file or die "Cannot unlink $file: $!"; 
} 

Обратите внимание, что при удалении файлов может быть разумным проверить наличие сбоя.

+0

** <*> можно также заменить глобусом «*», который может быть более читаемым. ** Вы должны использовать glob в своем ответе, потому что это <*>, что делает его похожим на дескриптор файла. – 7stud

Смежные вопросы