2016-10-31 14 views
0

merch.txtからデータを読み取るCGIは機能しますが、これをどのようにテーブルに入れることができますか?PerlでCGIを使ってデータをテーブルに入れてテキストファイルを読むにはどうすればよいですか?

HTMLファイル:それは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

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これはマーチからコンテンツを読み込み、CGIファイルです。 txt

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 
+0

を。これらを最初に解決するには、コマンドラインから実行するか、サーバーのエラーログを確認することをお勧めします。 これを試してみてください: 'print"​​

", CGI::escapeHTML($orders[$i])."
\n", "
\ n ";' – ardavey

+0

@ardavey。それをキャッチしてくれてありがとう。私が理解しようとしているのは、列と行のあるテーブルのように見えるようにする方法です – r2d222

答えて

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 

しかし、あなたのPerlコードで生のHTMLを混合は、ひどいアイデアです。代わりにテンプレートエンジンを使用してください。私はTemplate Toolkitをお勧めします。

ここでは、TTを使用して必要な作業を行う簡単なCGIプログラムを紹介します。

#!/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; 

そして、あなたはこのようになりますテンプレート必要があります:あなたは、あなたのループ内で `print`ラインでいくつかの引用符および/または文字列連結演算子を逃した

<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> 
関連する問題