Как я могу Parser файл без указания имени файла в Perl? - PullRequest
0 голосов
/ 27 марта 2019

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

my @indexFiles= "www/I.html";
my @rdata = readFile("@indexFiles");
sub readFile{
  my $somefile = $_[0];
  my @links = ($somefile);
  my $p = HTML::TokeParser->new($somefile) || die "Can't open: $!";
  while (my $token = $p->get_tag("img","a")){
     my $currentlink = $token->[1]{href} || $token->[1]{src};
     my $finalLink= $directory."/".$currentlink ; 
     if($currentlink =~ /\.html$/){
         my @data = readFile($finalLink);  
         push @links,@data;
     } else{
          push @links,$finalLink;
     }
  }
  return @links;
}

В папке www у меня 3 HTML-файла, 2 папки.

my @indexFiles= "www/I.html" В этой строке я передаю конкретный путь и имя файла. Я не хочу передавать это имя. Вместо этого он будет выбран автоматически.

Например: когда я запускаю свою программу perl c.pl www. Стоит разобрать весь файл. Я даю конкретное имя файла I.html, после чего он будет искать img и тег.

1 Ответ

1 голос
/ 27 марта 2019

Ваш вопрос не имеет ничего общего с разбором или HTML :: TokeParser;похоже, что он определяет, ссылается ли путь на каталог или нет, и получает список файлов в каталоге, если он ссылается на каталог.

stat и -d (вместе или независимо) может использоваться для проверки, ссылается ли путь на каталог.

На самом низком уровне opendir + readdir + closedir используется для чтения каталога.Встроенные и многочисленные модули glob предоставляют альтернативные способы сделать это.

Рекурсивный поиск:

sub process {
   for my $qfn (@_) {
      stat($qfn)
         or die("Can't stat \"$qfn\": $!\n");

       if (-d _) {
          process(glob("\Q$qfn\E/*"));
       }
       elsif ($qfn =~ /\.html\z/) {
          process_html_file($qfn);
       }
   }
}

process('www');

Нерекурсивный поиск:

sub process {
   for my $qfn (@_) {
      stat($qfn)
         or die("Can't stat \"$qfn\": $!\n");

       if (-d _) {
          process_html_file(glob("\Q$qfn\E/*.html"));
       }
       elsif ($qfn =~ /\.html\z/) {
          process_html_file($qfn);
       }
   }
}

process('www');

В качестве альтернативы вы можете использовать File :: Find :: Rule .

Рекурсивный поиск:

use File::Find::Rule qw( );

process_html_file($_)
   for File::Find::Rule->name('*.html')->file->in('www');

Нерекурсивный поиск:

use File::Find::Rule qw( );

process_html_file($_)
   for File::Find::Rule->maxdepth(1)->name('*.html')->file->in('www');
...