0

从 merch.txt 读取数据的 CGI 可以工作,但我怎样才能把它放在一个表中?

HTML 文件:

<form action="/cgi-bin/asst5/data.cgi" method="post">
<table border="2" cellspacing="5" cellpadding="5">
<tr>
   <td align="center">SKU: </td>
   <td><input type="text" name="code" size="15"></td>
</tr>
<tr>
   <td align="center">Name: </td>
   <td><input type="text" name="customer" size="15"></td>
</tr>
</table>
</form>

Data.CGI,其中数据在 HTML 中输入后被接受

my $sku = param('code');
my $cust = param('customer');

print <<HERE;
<HTML>
<BODY>
SKU: $sku<br>
Name: $cust<br>

HERE
open (ORDERS, ">>merch.txt") or die "File error, $!";
print ORDERS "$sku|$cust\n";
close ORDERS;

Read.CGI 这是从 merch.txt 读取内容的 CGI 文件

open ( ORDERS, "merch.txt" ) or die "Error opening file, $!";
my @orders = <ORDERS>;
close ORDERS;

print <<here;
<HTML>
<BODY>
here
for (my $i = 0; $i < @orders; $i++ )  {
print "<td><pre>", CGI::escapeHTML($orders[$i])."<br>\n", "</pre></td>\n";
}
print <<MORE;
</BODY>
</HTML>
MORE
4

1 回答 1

2

使用原始嵌入式 HTML 方法并不难。但它非常丑陋。

print <<END_OF_HTML;
<html>
<body>
<table>
<tr><th>Sku</th><th>Cust</th></tr>
END_OF_HTML

for (@orders)  {
  my ($sku, $cust) = split /\|/;
  print '<tr><td>', CGI::escapeHTML($sku), '</td>',
            '<td>', CGI::escapeHTML($cust), '</td></tr>';
}

print <<END_OF_HTML;
</table>
</body>
</html>
END_OF_HTML

但是将原始 HTML 与您的 Perl 代码混合是一个糟糕的主意。请改用模板引擎。我推荐模板工具包

这是一个简单的 CGI 程序,它使用 TT 来完成您需要的操作。

#!/usr/bin/perl

use strict;
use warnings;
use Template;
use CGI qw[header];

my $tt = Template->new;

# Best practice: three-arg open() and lexical filehandles
open my $ord_fh, '<', 'merch.txt' or die $!;
my @orders = <$ord_fh>;
close $ord_fh;

my @order_data = map {
  my ($sku, $cust) = split /\|/;
  { sku => $sku, cust => $cust }
} @orders;

print header;
$tt->process('orders.tt', { orders => \@order_data })
  or dir $tt->error;

你需要一个看起来像这样的模板:

<html>
  <head>
    <title>Orders</title>
  </head>
  <body>
    <h1>Orders</h1>
    <table>
      <tr><th>Sku</th><th>Cust</th></tr>
[% FOREACH order IN orders -%]
      <tr><td>[% order.sku | html %]</td><td>[% order.cust | html %]</td></tr>
[% END -%]
    </table>
  </body>
</html>
于 2016-11-01T09:08:13.573 回答