Как создать документ HTML из нескольких файлов в Perl? - PullRequest
1 голос
/ 29 октября 2009

Мне нужна помощь в создании этого скрипта ... пока я думаю, что он должен выглядеть примерно так (я часто использую AWK)

#!/usr/bin/perl -w
@filelist=(
file1,
file2,
file3
)
print ("<html>");
foreach $filelist {
  print ("<table>";
  print ("<td>"$filelist"</td>")
  foreach [line in the file]
    print ("<td>"$1, $2"</td>");
  }
  print ("</table>";
}
print ("</html>");

Итак, я хочу, чтобы скрипт шел к каждому файлу, печатал имя файла, а затем для каждой строки выводил две строки в <td>

Я на правильном пути?

Кроме того, я понял, что AWK, который я написал, нужна была пара утверждений IF - я считаю, что это должно выглядеть так

while(<F_IN>) {
if ($1>=2) {
    print "<td class=\"green\" title=\""$1,$2"\">"
}
if ($1>=1) {
    print "<td class=\"amber\" title=\""$1,$2"\">"
}
if ($1>=0) {
    print "<td class=\"red\" title=\""$1,$2"\">"
}

Ответы [ 5 ]

8 голосов
/ 29 октября 2009

Ваш код на самом деле не имеет никакого смысла. Я предлагаю взглянуть на базовое введение Perl , прежде чем пытаться что-то более сложное.

Тем не менее, вы, вероятно, пытаетесь сделать что-то вроде этого:

#!/usr/bin/perl

use strict;      # never forget this line
use warnings;    # or this one, it's better than the -w flag

use CGI qw(:standard);   # this gives us convenient functions for outputting
                         # HTML, plus other stuff for processing CGI requests

my @filelist = ( 'file1', 'file2', 'file3' );

print header;
print start_html;
print start_table;

foreach my $file( @filelist ) { 
    print Tr( td( $file ) );
}

print end_table;
print end_html;

Подробную документацию по модулю CGI см. В CGI в CPAN.

Редактировать

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

foreach my $file( @filelist ) { 
    open my $fh, $file or die "Could not open $file: $!";

    local $/ = undef;   # this allows us to slurp the whole file at once
    my $filedata = <$fh>;

    print Tr( td( $filedata ) );
}

Еще несколько документов, которые вы должны прочитать: Учебник Perl open () и все о slurping .

4 голосов
/ 29 октября 2009

Используйте HTML :: Template , чтобы у вас был полный контроль над HTML, и ваш код не читался. См. мой ответ на другой вопрос для примера того, как внедрить шаблон в ваш код. Конечно, один и тот же шаблон может существовать вне сценария, и это является преимуществом отделения представления от логики.

#!/usr/bin/perl

use strict; use warnings;
use autodie;

use HTML::Template;

my @files = qw(file1 file2);
my @files_loop;

for my $file (@files) {
    open my $fh, '<', $file;

    push @files_loop, {
        LINES => [
            map { chomp; length $_ ? {LINE => $_} : () } <$fh>
    ]};
}

my $tmpl = HTML::Template->new(filehandle => \*DATA);
$tmpl->param(FILES => \@files_loop );
print $tmpl->output;

__DATA__
<html>
<body>
<TMPL_LOOP FILES>
<table>
<TMPL_LOOP LINES><tr><td><TMPL_VAR LINE></td></tr></TMPL_LOOP>
</table>
</TMPL_LOOP>
</html>

Выход:

C:\Temp> fish.pl
<html>
<body>

<table>
<tr><td>bye bye</td></tr><tr><td>hello</td></tr><tr><td>thank you</td></tr><tr><
td>no translation</td></tr>
</table>

<table>
<tr><td>chao</td></tr><tr><td>hola</td></tr><tr><td>gracias</td></tr>
</table>

</html>
3 голосов
/ 29 октября 2009

Запустите ваш код и прочитайте сообщения об ошибках. У вас есть несколько синтаксических ошибок.

Какой бы учебник вы не читали, это не даст вам несколько важных советов:

#!/usr/bin/perl 

use strict;    # Always, until you know when to turn it off--and then in a limited scope.
use warnings;  # see perllexwarn for why this is better than -v  

# you need to quote those bare words.  qw is a handy quoting operator.  See perlop.
my @filelist = qw(  
    file1 
    file2
    file3
);             # added semicolon 

# use a heredoc for big chunks of text.
# your html is seriously bogus.  Fixed somewhat.
print <<'ENDHTML';
<html>
   <head>
   </head>
   <body>
ENDHTML

# $filelist does not exist.
# fixed syntax of foreach
foreach my $file ( @filelist ) {

  # do you really want a new table for each file?
  print "<table>\n";

  # need to escape your quotes
  print "<tr><td>\"$file\"</td></tr>";

  # open a file handle.
  # use lexical handles instead of old style global handles.
  # use 3 argument open instead of 2 argument style
  open( my $fh, '<', $file);

  # $fh evaluates to true if we were able to open the file.
  if ( $fh ) {

    # iterate over the file.
    while( my $line = <$fh> ) {
      # where the hell did $1 and $2 come from?
      print "<tr><td>$line</td></tr>";
    }

  }
  else {
      # put the error message in the table instead of the file contents
      print "<tr><td>Error opening file: $!</td></tr>";          
  }

  print "</table>";
}
print "</html>";

Так как вы не тестировали свой код, я тоже этого не делал. Но это должно сработать.

Конечно, встроенный HTML лучше избегать во всех, кроме самых простых, одноразовых скриптов. Если вы делаете что-то длительное или серьезное, используйте систему шаблонов, такую ​​как Template :: Toolkit или HTML :: Template.

0 голосов
/ 11 ноября 2009

Некоторые превосходные ответы выше. Вот еще один поворот темы на этот раз с использованием Markapl на основе ответа Соупа.

use strict; 
use warnings;
use CGI ();
use Markapl;

my @filelist = qw/file1.txt file2.txt file3/;

template 'web' => sub {
  html {
    head {
      html_link (rel => 'stylesheet', type => 'text/css', href => 'test.css') {}
    }
    body {
      table {
        for my $file (@filelist) {
          open my $fh, '<', $file or next;
          row { 
            for my $title (<$fh>) { 
                chomp $title; 
                cell { $file }
                cell ( class => title_class( $title ), title => $title ) {}
} } } } } } };

print CGI::header();
print main->render( 'web' );

sub title_class {
    my $first_char = substr $_[0], 0, 1;
    return 'green' if $first_char >= 2;
    return 'amber' if $first_char == 1;
    return 'red';
}

Мне нравятся эти подходы типа "строитель". Для получения дополнительной информации см. Этот вопрос SO CL-WHO-подобный шаблон HTML для других языков?

/ I3az /

0 голосов
/ 30 октября 2009

Вот что я придумал, поговорив с вами, ребята, большое спасибо всем: D

        #!/usr/bin/perl

    use strict;      # never forget this line
    use warnings;    # or this one, it's better than the -w flag

    use CGI qw(:standard);   # this gives us convenient functions for outputting
                             # HTML, plus other stuff for processing CGI requests

    my @filelist=(
'file1',
'file2',
'file3',
'file4',
'file5',
'file6',
    );
    #
    #
    print "<html>\n";
    print "<head>\n";
    print "<link rel=\"stylesheet\" type=\"text/css\" href=\"test.css\">\n";
    print "</head>\n";
    foreach my $file (@filelist) {
        print "<table>\n";
        print "<div>\n";
        print "<tr>\n";
        print  td( $file );
        open( my $fh, '<', $file);
        if ($fh) {
          while( my $line = <$fh> ) {
          chomp $line;
          if (substr($line, 0, 1)>="2") {
            print "<td class=\"green\" title=\"" . $line . "\">\n";
            }
          elsif (substr($line, 0, 1)=="1") {
            print ("<td class=\"amber\" title=\"" . $line . "\">\n");
            }
          elsif (substr($line, 0, 1)=="0") {
            print ("<td class=\"red\" title=\"" . $line . "\">\n");
            }
          }
        }
        print "</tr>\n";
        print "</div>\n";
        print "</table>\n";
    }
    print "</html>";

HTML-код нуждается в небольшой настройке, и большая его часть является избыточной, но работает нормально:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...