Perl — Как обойти каталог, проанализировать каждый файл в каталоге и извлечь все комментарии в html-файл

#perl

#perl

Вопрос:

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

примеры кода или существующие модули, которые уже делают это, были бы великолепны.

Спасибо!

Комментарии:

1. Все ли файлы, из которых вы хотите извлечь комментарии, одного типа? Люди, отвечающие на этот вопрос, должны знать, потому что perl, C и html имеют разные последовательности символов для обозначения комментариев. Кроме того, вам нужен вывод HTML? Как вы хотите, чтобы этот html выглядел (таблица, список, упорядоченный по файлам и т.д.)?

Ответ №1:

PPI можно использовать для анализа файлов кода Perl. Это должно помочь вам начать с получения файлов Perl в каталоге (при условии, что у них есть .pl расширения) и получения комментариев. Я не уверен, что вы имеете в виду, говоря о фрагменте HTML:

 use warnings;
use strict;
use PPI;

my $dir = shift;
for my $file (glob "$dir/*.pl") {
    my $doc = PPI::Document->new($file);
    for my $com (@{ $doc->find('PPI::Token::Comment') }) {
        print $com->{content};
    }
}
  

Обновление: Посмотрите на HTML::Template (но это может быть излишним).

Комментарии:

1. Спасибо, я изучу это. Что касается фрагмента html, я хочу, чтобы все мои комментарии были записаны в html-файлы для целей документации без использования POD.

Ответ №2:

Простой поиск cpan по ключевому слову «dir» выдал целую кучу полезных модулей. Один из тех, которые я часто использую, это:

Ввод-вывод::Dir

Ответ №3:

Если у вас есть выбор, вот скрипт Ruby

 #!/usr/bin/env ruby 
print "Enter directory: "
directory=File.join(gets.chomp,"*.pl")
directory="/home/yhlee/test/ruby/*.pl"
c=0
Dir[directory].each do |file|
    c =1
    o = File.open("file_#{c}.html","w")
    File.open(file).each do |line|
        if line[/#/]
            o.write ( line.scan(/;*s (#.*)$/)[0].first   "n" ) if line[/;*s #/]
            o.write ( line.scan(/^s (#.*)$/)[0].first   "n") if line[/^s #/]
        end
    end
    o.close
end
  

Комментарии:

1. Что это делает для строки кода Perl типа «while (1) { # комментарий»? (я предполагаю, что это делает неправильную вещь …)