2016-10-31 3 views
0

merch.txt에서 데이터를 읽는 CGI가 작동하지만 어떻게 이것을 테이블에 넣을 수 있습니까?Perl에서 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이 그 제품의 내용을 읽고 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 

하지만 당신의 펄 코드로 원시 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> 
관련 문제