ch23.htm

来自「《Perl 5 Unreleased》」· HTM 代码 · 共 1,412 行 · 第 1/5 页

HTM
1,412
字号
</FONT></B>

</BLOCKQUOTE>

<BLOCKQUOTE>

<TT><FONT FACE="Courier">&nbsp;1 #!/usr/bin/perl<BR>

&nbsp;2 <BR>

&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

use HTML::Base;<BR>

&nbsp;4 <BR>

&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

Start the HTML, create a &lt;BODY&gt; tag<BR>

&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$body

= new HTML::Base::Body;<BR>

&nbsp;7 <BR>

&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

Create an &lt;H1&gt;<BR>

&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Header 1;<BR>

10 <BR>

11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

Add some text to the header<BR>

12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot;This is a header&quot;;<BR>

13 <BR>

14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

Add an image to the header<BR>

15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Image ('SRC','notepad.gif');<BR>

16 <BR>

17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

Make the body current again<BR>

18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$body-&gt;make_current;

<BR>

19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

Add a paragraph to the body<BR>

20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Paragraph;<BR>

21 <BR>

22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

Add some text to the paragraph<BR>

23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot;This is a paragraph&quot;;<BR>

24 <BR>

25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$outtable

= new HTML::Base::Table ('BORDER', ' ');<BR>

26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h

= new HTML::Base::TableHeader;<BR>

27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot;Header 1&quot;;<BR>

28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h-&gt;end_object;

<BR>

29 <BR>

30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h

= new HTML::Base::TableHeader;<BR>

31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot;Header 2&quot;;<BR>

32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h-&gt;end_object;

<BR>

33 <BR>

34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::TableRow ;<BR>

35&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r

= new HTML::Base::TableData ;<BR>

36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot;Row 1 Col 1&quot;;<BR>

37 <BR>

38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r

= new HTML::Base::TableData ;<BR>

39&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot;Row 1 Col 2&quot;;<BR>

40 <BR>

41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::TableRow ;<BR>

42 <BR>

43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r

= new HTML::Base::TableData ;<BR>

44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot;Row 2 Col 1&quot;;<BR>

45 <BR>

46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r

= new HTML::Base::TableData ;<BR>

47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot;Row 2 Col 2&quot;;<BR>

48 <BR>

49&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$outtable-&gt;end_object;

<BR>

50 <BR>

51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

Output everything<BR>

52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$body-&gt;realize;</FONT></TT>

</BLOCKQUOTE>

<HR>

<P>

Here is the output for the HTML tables in the output file: 

<BLOCKQUOTE>

<TT><FONT FACE="Courier">&lt;BODY&gt;<BR>

&lt;H1&gt;<BR>

This is a header<BR>

&lt;IMG SRC=&quot;notepad.gif&quot;&gt;&lt;/H1&gt;<BR>

&lt;P&gt;<BR>

This is a paragraph<BR>

&lt;TABLE BORDER=&quot; &quot;&gt;<BR>

&lt;TH&gt;<BR>

Header 1<BR>

&lt;/TH&gt;<BR>

&lt;TH&gt;<BR>

Header 2<BR>

&lt;/TH&gt;<BR>

&lt;TR&gt;<BR>

&lt;TD&gt;<BR>

Row 1 Col 1<BR>

&lt;/TD&gt;<BR>

&lt;TD&gt;<BR>

Row 1 Col 2<BR>

&lt;/TD&gt;<BR>

&lt;TR&gt;<BR>

&lt;TD&gt;<BR>

Row 2 Col 1<BR>

&lt;/TD&gt;<BR>

&lt;TD&gt;<BR>

Row 2 Col 2<BR>

&lt;/TD&gt;<BR>

&lt;/TR&gt;<BR>

&lt;/TR&gt;<BR>

&lt;/TABLE&gt;<BR>

&lt;/P&gt;<BR>

&lt;/BODY&gt;</FONT></TT>

</BLOCKQUOTE>

<P>

Sure, the output does not look pretty as far as HTML pages go.

However, the code generating this HTML output is abstracted from

the HTML implementation below it. If the HTML specification is

upgraded, the package optimized, or the module otherwise enhanced,

then our Perl scripts would not be affected as long as the interface

is kept consistent.

<P>

Let's rewrite the usage of the <TT><FONT FACE="Courier">getstats</FONT></TT>

module with the <TT><FONT FACE="Courier">CGI</FONT></TT> and <TT><FONT FACE="Courier">HTML</FONT></TT>

modules (see Listing 23.8). The placement of the <TT><FONT FACE="Courier">&lt;TR&gt;</FONT></TT>

and <TT><FONT FACE="Courier">&lt;/TR&gt;</FONT></TT> tags is now

correct because the row object is ended correctly. Contrast the

output of this listing with the output from Listing 23.9. You'll

see how the <TT><FONT FACE="Courier">&lt;/TR&gt;</FONT></TT> tags

are matched when objects are ended and how they output one long

list when objects are not ended correctly.

<P>

As a rule, if you create a row, you must end it.

<HR>

<BLOCKQUOTE>

<B>Listing 23.8. A rewrite of the </B><TT><B><FONT FACE="Courier">getstats</FONT></B></TT><B>

script using Perl modules.<BR>

</B>

</BLOCKQUOTE>

<BLOCKQUOTE>

<TT><FONT FACE="Courier">&nbsp;1 #!/usr/bin/perl<BR>

&nbsp;2 #<BR>

&nbsp;3 # Return Statistics using Perl Modules.<BR>

&nbsp;4 #<BR>

&nbsp;5 use CGI::Base;<BR>

&nbsp;6 use CGI::Request qw(:DEFAULT :cgi-lib);<BR>

&nbsp;7 <BR>

&nbsp;8 print PrintHeader();<BR>

&nbsp;9 <BR>

10 use HTML::Base;<BR>

11 <BR>

12 # Start the HTML, create a &lt;BODY&gt; tag<BR>

13 $body = new HTML::Base::Body;<BR>

14 <BR>

15 # Create an &lt;H1&gt; header<BR>

16 new HTML::Base::Header 1;<BR>

17 <BR>

18 # Add some text to the header<BR>

19 $date = 'date';<BR>

20 new HTML::Base::Text &quot;The top 10 most recent files hit

as of $date&quot;;<BR>

21 <BR>

22 # Make the body current again<BR>

23 <BR>

24 $body-&gt;make_current;<BR>

25 # Add a paragraph to the body<BR>

26 <BR>

27 new HTML::Base::HorizontalRule;<BR>

28 new HTML::Base::Paragraph;<BR>

29 <BR>

30 $a = '/usr/local/bin/getstats';<BR>

31 <BR>

32 #<BR>

33 # Remove the following lines<BR>

34 #<BR>

35 #print &quot;\n &lt;TABLE BORDER&gt; &quot;;<BR>

36 #print &quot;\n &lt;TD&gt; Hits &lt;/TD&gt; &quot;;<BR>

37 #print &quot;\n &lt;TD&gt; Last &lt;/TD&gt; &quot;;<BR>

38 #print &quot;\n &lt;TD&gt; Filename &lt;/TD&gt; &quot;;<BR>

39 <BR>

40 $outtable = new HTML::Base::Table ('BORDER', '');<BR>

41 <BR>

42 $h = new HTML::Base::TableHeader;<BR>

43 new HTML::Base::Text &quot;Hits&quot;;<BR>

44 $h-&gt;end_object;<BR>

45 <BR>

46 $h = new HTML::Base::TableHeader;<BR>

47 new HTML::Base::Text &quot;Last&quot;;<BR>

48 $h-&gt;end_object;<BR>

49 <BR>

50 $h = new HTML::Base::TableHeader;<BR>

51 new HTML::Base::Text &quot;Filename&quot;;<BR>

52 $h-&gt;end_object;<BR>

53 <BR>

54 $found = 0;<BR>

55 $ctr = 0;<BR>

56 foreach $x (split('\n', $a)) {<BR>

57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if

($x =~ /\#/) {<BR>

58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$x

= &quot;&quot;;&nbsp;&nbsp;&nbsp;# just ignore it.<BR>

59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

<BR>

60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if

($x =~ /(.*) : (.*) : (.*)/ )&nbsp;&nbsp;{<BR>

61&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$x

=~ s/ //g;<BR>

62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;($hits,

$recent, $fname) = split(':',$x);<BR>

63&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ctr++;

<BR>

64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if

($ctr &lt; 10)&nbsp;&nbsp;&nbsp;{<BR>

65&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#

print &quot;\n&lt;TR&gt;&lt;TD&gt;$hits&lt;/TD&gt;\n&lt;TD&gt;$recent&lt;/TD&gt;&lt;TD&gt;$fname&lt;/TD&gt;&quot;;

<BR>

66&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r

=new HTML::Base::TableRow ;<BR>

67&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h

= new HTML::Base::TableData ;<BR>

68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot; $hits&quot;;<BR>

69&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h-&gt;end_object;

<BR>

70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h

= new HTML::Base::TableData ;<BR>

71&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot; $recent&quot;;<BR>

72&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h-&gt;end_object;

<BR>

73&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h

= new HTML::Base::TableData ;<BR>

74&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new

HTML::Base::Text &quot; $fname&quot;;<BR>

75&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$h-&gt;end_object;

<BR>

76&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$r-&gt;end_object;

<BR>

77&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

<BR>

78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

<BR>

79 }<BR>

80 $outtable-&gt;end_object;<BR>

81 #<BR>

82 # Okay finish the HTML document.<BR>

83 #<BR>

84 $body-&gt;realize;</FONT></TT>

</BLOCKQUOTE>

<HR>

<P>

Here's the output of the <TT><FONT FACE="Courier">getstats</FONT></TT>

rewrite:

<BLOCKQUOTE>

<TT><FONT FACE="Courier">Content-type: text/html<BR>

<BR>

&lt;BODY&gt;<BR>

&lt;H1&gt;<BR>

The top 10 most recent files hit as of Sun Feb  4 16:55:30 CST

1996<BR>

<BR>

&lt;/H1&gt;<BR>

&lt;HR&gt;<BR>

&lt;P&gt;<BR>

&lt;TABLE BORDER&gt;<BR>

&lt;TH&gt;<BR>

Hits<

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?