[Perl入門に戻る]
(perlの第1歩) (出力の工夫) (ファイルの読み込みと行の処理) (ファイルの入出力--補足) (文字列の処理)

出力の工夫

次のようなHTMLファイルを出力することを目標とします (行頭の行番号は説明の都合上つけたものです): sample01.html:
 1 <HTML>
 2 <HEAD>
 3 <TITLE>2000年3月の予定</TITLE>
 4 </HEAD>
 5 <BODY BGCOLOR="#FFFFFF">
 6 [<A HREF="perl02.html">「出力の工夫」に戻る</A>]
 7 <CENTER>
 8 <H1>2000 年 3 月</H1>
 9 <TABLE BORDER BGCOLOR="#C0C0FF">
10 <TR BGCOLOR="#80FF80">
11 <TH WIDTH="100">日</TH>
12 <TH WIDTH="100">月</TH>
13 <TH WIDTH="100">火</TH>
14 <TH WIDTH="100">水</TH>
15 <TH WIDTH="100">木</TH>
16 <TH WIDTH="100">金</TH>
17 <TH WIDTH="100">土</TH>
18 </TR>
19 <TR>
20 <TD VALIGN="top" WIDTH="100" >  <BR></TD>
21 <TD VALIGN="top" WIDTH="100" >  <BR></TD>
22 <TD VALIGN="top" WIDTH="100" >  <BR></TD>
23 <TD VALIGN="top" WIDTH="100" >1 <BR></TD>
24 <TD VALIGN="top" WIDTH="100" >2 <BR></TD>
25 <TD VALIGN="top" WIDTH="100" >3 <BR></TD>
26 <TD VALIGN="top" WIDTH="100" >4 <BR></TD>
27 </TR>
28 <TR>
29 <TD VALIGN="top" WIDTH="100" >5 <BR></TD>
30 <TD VALIGN="top" WIDTH="100" >6 <BR></TD>
31 <TD VALIGN="top" WIDTH="100" >7 <BR></TD>
32 <TD VALIGN="top" WIDTH="100" >8 <BR></TD>
33 <TD VALIGN="top" WIDTH="100" >9 <BR></TD>
34 <TD VALIGN="top" WIDTH="100" >10 <BR></TD>
35 <TD VALIGN="top" WIDTH="100" >11 <BR></TD>
36 </TR>
37 <TR>
38 <TD VALIGN="top" WIDTH="100" >12 <BR></TD>
39 <TD VALIGN="top" WIDTH="100" >13 <BR></TD>
40 <TD VALIGN="top" WIDTH="100" >14 <BR></TD>
41 <TD VALIGN="top" WIDTH="100" >15 <BR></TD>
42 <TD VALIGN="top" WIDTH="100" >16 <BR></TD>
43 <TD VALIGN="top" WIDTH="100" >17 <BR></TD>
44 <TD VALIGN="top" WIDTH="100" >18 <BR></TD>
45 </TR>
46 <TR>
47 <TD VALIGN="top" WIDTH="100" >19 <BR></TD>
48 <TD VALIGN="top" WIDTH="100" >20 <BR></TD>
49 <TD VALIGN="top" WIDTH="100" >21 <BR></TD>
50 <TD VALIGN="top" WIDTH="100" >22 <BR></TD>
51 <TD VALIGN="top" WIDTH="100" >23 <BR></TD>
52 <TD VALIGN="top" WIDTH="100" >24 <BR></TD>
53 <TD VALIGN="top" WIDTH="100" >25 <BR></TD>
54 </TR>
55 <TR>
56 <TD VALIGN="top" WIDTH="100" >26 <BR></TD>
57 <TD VALIGN="top" WIDTH="100" >27 <BR></TD>
58 <TD VALIGN="top" WIDTH="100" >28 <BR></TD>
59 <TD VALIGN="top" WIDTH="100" >29 <BR></TD>
60 <TD VALIGN="top" WIDTH="100" >30 <BR></TD>
61 <TD VALIGN="top" WIDTH="100" >31 <BR></TD>
62 <TD VALIGN="top" WIDTH="100" >  <BR></TD>
63 </TR>
64 </TABLE>
65 </CENTER>
66 </BODY>
67 </HTML>

すでにみた cal.pl と同様に月や年が $mon や $year 変数に格納されている状態とします。 cal.pl の11行目の部分(年・月の行と曜日の行の出力)に対応する部分をまず作ります。 上の sample01.html の1行目から18行目までを出力しなければなりません。

次のように記述すればとりあえず出力できます。 注意するのは"で囲まれた文字列の中に " という文字自身をいれるときは、 文字列の終端の"と区別するために前に\をつけて \" としなければならないことです。

print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>$year年$mon月の予定</TITLE>\n";
print "</HEAD>\n";
print "<BODY BGCOLOR=\"#FFFFFF\">\n";
print "[<A HREF=\"perl02.html\">「出力の工夫」に戻る</A>]\n";
print "<CENTER>\n";
print "<H1>$year 年 $mon 月</H1>\n";
print "<TABLE BORDER BGCOLOR=\"#C0C0FF\">\n";
.......
print "<TH WIDTH=\"100\">土</TH>\n";
print "</TR>\n";

でもこれでは print や \n をずいぶん何度も書かなければなりません。 実は""で囲む文字列は複数行に渡ることができ、 しかもそのとき改行文字は改行文字として扱われるので、 次のように書きなおすことができます。

print "<HTML>
<HEAD>
<TITLE>$year年$mon月の予定</TITLE>
</HEAD>
<BODY BGCOLOR=\"#FFFFFF\">
[<A HREF=\"perl02.html\">「出力の工夫」に戻る</A>]
.......
.......
<TH WIDTH=\"100\">土</TH>
</TR>
";

しかしこれでも " の部分を \" としなければならず、不便です。 実はさらに次のようにかくこともできます。 赤い HERE は識別子で、適当に決めます。 通常の文字列の場合と同様に、最初の識別子を囲む引用符号の種類で、 中の変数の変数置換を行なうかどうかが変わります。 引用符号を省略すると " で囲まれたものと見なされます。

print <<"HERE";
<HTML>
<HEAD>
<TITLE>$year年$mon月の予定</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
[<A HREF="perl02.html">「出力の工夫」に戻る</A>]
.......
.......
<TH WIDTH="100">土</TH>
</TR>
HERE

それでは、cal.pl を sample01a.pl という名前でコピーして、 11行目から18行目までの行頭に#を記述してコメントにして下さい。 そして上のいずれかをコメントした部分のかわりに挿入します。 これだけですと表が未完成ですので、日付のはいる部分は後回しにして、 ともかく sample01.html の64行目以降の部分も出力するように、 上の部分をまねて記述して下さい。 sample01a.pl をセーブして、月と年を指定して実行してみて下さい。

       jperl sample01a.pl 5 2000
うまくいけば画面に表示されるはずです。 エラーがおきた場合はそのエラーメッセージをよく読んで修正を加えて下さい。 画面に表示するだけではブラウザで見ることができませんので、
       jperl sample01a.pl 5 2000 > tmp.html
と、tmp.html というファイルにリダイレクトして下さい。 tmp.html というファイルができますので、これをブラウザで見てみましょう。 曜日だけのカレンダーができたでしょうか。

さて、次にカレンダーの本体を出力するように変更します。 もとの cal.pl で言えば13行目から16行目の部分を復活させて、 14行目と15行目の部分に修正を加える必要があります。 sample01.html を見てみると、 単に日付($_変数に格納されている)を出力するかわりに

        "<TD VALIGN=\"top\" WIDTH=\"100\" >$_ <BR></TD>\n"
という文字列を print すればよさそうです。 ただし日曜日なら<TR> という1行をその前に、 土曜日なら </TR> という1行をその後に print しなければなりません。 さらに、cal.pl では不要でしたが、月の最後の日が土曜でない場合は空欄を余分に 出力する必要があります。 対応には色々方法があるでしょう。 好きなやり方で完成させて下さい。 sample01b.pl という名前でスクリプトを作り、実行してみましょう。


[Perl入門に戻る]