Проблема Perl - итератор каталога

Это можно сделать с помощью одного текстового элемента, который циклически изменяет свое содержимое с интервалом в 1 секунду. Обратите внимание, что я использую оператор модуля, чтобы пропустить цикл по массиву (в противном случае вы можете остаться с неопределенным, когда число превысило массив длина.

Обратите внимание, что вы можете установить это как переменную, а затем использовать clearInterval (переменная); чтобы остановить цикл.

У меня также нет анимации затухания, но шляпа должна быть легкой включить.

var content = ['This is text content 1',' This is another text  content', 'I am also a text content']; 
let contentLength = content.length;
let count=0;

function contentDisplay (){
   document.querySelector('#content').innerText = content[count % contentLength];
  count++;
}

// sets the initial display
contentDisplay();

// sets the interval to change the display
setInterval(contentDisplay, 1000);
#content {
  text-align: center;
  padding: 15px;
  font-size: 20px
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p id="content">text 1</p>

5
задан alain.janinm 30 April 2012 в 21:15
поделиться

10 ответов

Это походит на задание для File::Find::Rule:

#!/usr/bin/perl
use strict;
use warnings;
use autodie;  # Causes built-ins like open to succeed or die.
              # You can 'use Fatal qw(open)' if autodie is not installed.

use File::Find::Rule;
use Getopt::Std;

use constant SECONDS_IN_DAY => 24 * 60 * 60;

our %option = (
    m => 1,        # -m switch: days ago modified, defaults to 1
    o => undef,    # -o switch: output file, defaults to STDOUT
);

getopts('m:o:', \%option);

# If we haven't been given directories to search, default to the
# current working directory.

if (not @ARGV) {
    @ARGV = ( '.' );
}

print STDERR "Finding files changed in the last $option{m} day(s)\n";


# Convert our time in days into a timestamp in seconds from the epoch.
my $last_modified_timestamp = time() - SECONDS_IN_DAY * $option{m};

# Now find all the regular files, which have been modified in the last
# $option{m} days, looking in all the locations specified in
# @ARGV (our remaining command line arguments).

my @files = File::Find::Rule->file()
                            ->mtime(">= $last_modified_timestamp")
                            ->in(@ARGV);

# $out_fh will store the filehandle where we send the file list.
# It defaults to STDOUT.

my $out_fh = \*STDOUT;

if ($option{o}) {
    open($out_fh, '>', $option{o});
}

# Print our results.

print {$out_fh} join("\n", @files), "\n";
17
ответ дан 18 December 2019 в 05:11
поделиться

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

File::Find в этом патронажные работы приятно.

Может быть много способов сделать вещи в жемчуге, но где очень стандартная библиотека существует, чтобы сделать что-то, она должна быть использована, если она не имеет проблемы сами по себе.

#!/usr/bin/perl

use strict;
use File::Find();

File::Find::find( {wanted => \&wanted}, ".");

sub wanted {
  my (@stat);
  my ($time) = time();
  my ($days) = 5 * 60 * 60 * 24;

  @stat = stat($_);
  if (($time - $stat[9]) >= $days) {
    print "$_ \n";
  }
}
15
ответ дан 18 December 2019 в 05:11
поделиться

File::Find является правильным способом решить эту проблему. Там бесполезен в перереализации материала, который уже существует в других модулях, но перереализации чего-то, что находится в стандартном модуле, нужно действительно препятствовать.

8
ответ дан 18 December 2019 в 05:11
поделиться

Нет шести способов сделать это, существует старый путь и новый путь. Старый путь с File::Find, и у Вас уже есть несколько примеров этого. File::Find имеет довольно ужасный интерфейс обратного вызова, это было прохладно 20 лет назад, но мы шли дальше с тех пор.

Вот реальная жизнь (слегка исправлена) программа, которую я использую для убирания хлама на одном из моих рабочих серверов. Это использует File::Find::Rule, а не File::Find. File::Find::Rule имеет хороший декларативный интерфейс, который читает легко.

Randal Schwartz также записал File::Finder как обертка по File::Find. Это довольно хорошо, но это действительно не взлетело.

#! /usr/bin/perl -w

# delete temp files on agr1

use strict;
use File::Find::Rule;
use File::Path 'rmtree';

for my $file (

    File::Find::Rule->new
        ->mtime( '<' . days_ago(2) )
        ->name( qr/^CGItemp\d+$/ )
        ->file()
        ->in('/tmp'),

    File::Find::Rule->new
        ->mtime( '<' . days_ago(20) )
        ->name( qr/^listener-\d{4}-\d{2}-\d{2}-\d{4}.log$/ )
        ->file()
        ->maxdepth(1)
        ->in('/usr/oracle/ora81/network/log'),

    File::Find::Rule->new
        ->mtime( '<' . days_ago(10) )
        ->name( qr/^batch[_-]\d{8}-\d{4}\.run\.txt$/ )
        ->file()
        ->maxdepth(1)
        ->in('/var/log/req'),

    File::Find::Rule->new
        ->mtime( '<' . days_ago(20) )
        ->or(
            File::Find::Rule->name( qr/^remove-\d{8}-\d{6}\.txt$/ ),
            File::Find::Rule->name( qr/^insert-tp-\d{8}-\d{4}\.log$/ ),
        )
        ->file()
        ->maxdepth(1)
        ->in('/home/agdata/import/logs'),

    File::Find::Rule->new
        ->mtime( '<' . days_ago(90) )
        ->or(
            File::Find::Rule->name( qr/^\d{8}-\d{6}\.txt$/ ),
            File::Find::Rule->name( qr/^\d{8}-\d{4}\.report\.txt$/ ),
        )
        ->file()
        ->maxdepth(1)
        ->in('/home/agdata/redo/log'),

) {
    if (unlink $file) {
        print "ok $file\n";
    }
    else {
        print "fail $file: $!\n";
    }
}

{
    my $now;
    sub days_ago {
        # days as number of seconds
        $now ||= time;
        return $now - (86400 * shift);
    }
}
9
ответ дан 18 December 2019 в 05:11
поделиться

Мой предпочтительный метод состоит в том, чтобы использовать модуль File::Find в качестве так:

use File::Find;
find (\&checkFile, $directory_to_check_recursively);

sub checkFile()
{
   #examine each file in here. Filename is in $_ and you are chdired into it's directory
   #directory is also available in $File::Find::dir
}
4
ответ дан 18 December 2019 в 05:11
поделиться

Существует мой File::Finder, как уже упомянуто, но существует также мое iterator-as-a-tied-hash решение от Нахождения Файлов Инкрементно (Журнал Linux).

4
ответ дан 18 December 2019 в 05:11
поделиться

Другие упомянули File::Find, который является путем, которым я пошел бы, но Вы попросили итератор, который File::Find не (ни File::Find::Rule). Вы могли бы хотеть посмотреть на File::Next или File::Find::Object, который действительно имеет повторяющиеся интерфейсы. Mark Jason Dominus пробегается через создание Вашего собственного в главе 4.2.2 Perl Высшего порядка.

8
ответ дан 18 December 2019 в 05:11
поделиться

Я записал File::Find::Closures как ряд закрытий, которые можно использовать с File::Find, таким образом, Вы не должны писать свое собственное. Существует несколько функций mtime, которые должны обработать

use File::Find;
use File::Find::Closures qw(:all);

my( $wanted, $list_reporter ) = find_by_modified_after( time - 86400 );
#my( $wanted, $list_reporter ) = find_by_modified_before( time - 86400 );

File::Find::find( $wanted, @directories );

my @modified = $list_reporter->();

Вы не должны действительно использовать модуль, потому что я главным образом разработал его как способ, которым Вы могли посмотреть на код и украсть части, которые Вы хотели. В этом случае это немного более хитро, потому что все подпрограммы, которые имеют дело со статистикой, зависят от второй подпрограммы. Вы быстро получите идею из кода все же.

Удачи,

3
ответ дан 18 December 2019 в 05:11
поделиться

Я - riskying для получения downvoted, но по моему скромному мнению 'ls' (с соответствующими параметрическими усилителями) команда делает это самым известным производительным способом. В этом случае это могло бы быть довольно хорошее решение для передачи по каналу 'ls' от кода жемчуга до оболочки, возвратив результаты массиву или хешу.

Править: Это могла также быть используемая 'находка', как предложено в комментариях.

-2
ответ дан 18 December 2019 в 05:11
поделиться

Я пишу подпрограмму, которая читает каталог с readdir, выводит "." и ".." каталоги, рекурсивно вызывает, если это найдет новый каталог и исследует файлы на то, что я ищу (в Вашем случае, то Вы захотите использовать utime или stat). Ко времени сделана рекурсия, каждый файл должен был быть исследован.

Я думаю все функции, в которых Вы нуждались бы для этого сценария, описаны кратко здесь: http://www.cs.cf.ac.uk/Dave/PERL/node70.html

Семантика ввода и вывода является довольно тривиальным осуществлением, которое я оставлю Вам.

-1
ответ дан 18 December 2019 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: