6. Perlの基礎の続き
今日は、Perlの基礎の続きと、今までのレッスンの補足を行います。
■変数の宣言について
プログラムを書くときに、通常、変数の宣言というものが必要です。
これは、変数を使用する前に、これから「$a」という変数を使用しますという
宣言になります。
しかし、Perlは、基本的に変数を宣言しなくても使用できる作りになっています。
プログラムを書く人にとってはこれはとても楽になりますが、逆に宣言をしないと
困る場合が出てきます。
例えば、
-----------------------------------------------------------------
$test_string = "test";
# ・・・・・いろいろとプログラムが書かれている
print $test_strnig;
# ・・・・・いろいろとプログラムが書かれている
-----------------------------------------------------------------
といったプログラムを書いたとします。
しかし、これを実行すると、何も表示されません。
よく見ると、print文のところの「$test_string」が「$test_strnig」とスペルが
間違っています。
そのため、$test_strnigという変数は初めて使用されるが、中身は空なので、
何も表示されないのです。
もし、$test_string変数の宣言をしなくてはならないルールだったら、プログラムを
実行した時に、「何行目の$test_strnigが宣言されていません。」
とデバッガがエラーメッセージで親切に教えてくれます。 (実際は英語ですが・・)
簡単なプログラムならすぐに間違いを見つけることができると思いますが、
ものすごく大きいプロジェクトになってきた場合、たかが 1 文字間違えたくらいで
どこが間違えているのか分からないと、逆に効率が悪くなってしまうのです。
そこで、Perlで変数の宣言を必要とするルールに変更する方法をご紹介します。
#! /usr/local/bin/perl
の後に
use strict;
と書くだけです。私が配信しているメールマガジンは、毎回これを行っています。
実際の宣言は、
my $a;
my ($b, @c);
my (%data);
my $d = 10;
といった感じになります。
$aと、配列の@aを宣言すると、別々のものとして扱われます。
ハッシュ配列の%aも別のものとして扱われます。
先ほどのサンプルでは、
-----------------------------------------------------------------
use strict;
my $test_string = "test";
# ・・・・・いろいろとプログラムが書かれている
print $test_strnig;
# ・・・・・いろいろとプログラムが書かれている
-----------------------------------------------------------------
こうすると、実行した時にエラーとなります。サーバによっては、エラーメッセージ
が表示されないので、その場合は、Perlのデバッガを使用すると分かります。
(Perlのデバッガについては、別の機会に)
宣言されていない変数名を使用すると、エラーになるので、いちいち宣言を
書かなくてはならなくなります。少々面倒ですが、バグの原因を少なくできるので、
なるべく使用する習慣をつけることをお薦めします。
宣言方法はmyの他、localなどがありますが、これらについては関数が絡んで
くるので、また後日説明します。
■HTML出力について
PerlプログラムからHTMLを出力する際の、記述方法について解説します。
今までのサンプルでもHTMLを出力する際に
-----------------------------------------------------------------
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<html>
・・・・・
</html>
END_OF_HTML
-----------------------------------------------------------------
のように書いてきました。
今日は、これらを詳しく説明いたします。
まず、
print "Content-type:text/html\n\n";
ですが、これはヘッダを出力しています。
ヘッダといっても、<head> 〜 </head>のようなHTMLタグのことではなく、
<HTML>タグのさらに前のヘッダになります。これは、ブラウザから見ても表示
されません。このヘッダは、HTTPヘッダと言います。
このヘッダは、何なのかと言いますと、ホームページが置いてあるサーバと
ホームページを見る人のクライアントマシンがやり取りするために必要な
記述のルールとなっています。
つまり、ホームページを見る人は、まずこのURLのページをくださいとサーバに
アクセスするわけですが、その返事に、このページはこういったページですという
情報が書かれた部分がHTTPのヘッダというわけです。
HTTPヘッダには、ファイル形式、文字コード、ファイル更新日など、いろいろと
な情報が含まれますが、ほとんどはプログラム中に記述しなくても問題ありません。
しかし、Perlの場合、少なくともファイル形式を意味するContent-typeだけは
送らないとエラーとなってしまいます。
ですので、PerlでHTML出力するときは、常に
print "Content-type:text/html\n\n";
が必要になるのです。
他の言語では、デフォルトでContent-typeが送信されるため、ヘッダに何も
書かなくてもエラーにはなりません。
text/htmlというのは、このファイル形式はテキストのHTMLですということを
意味します。
また、\n\nと、改行を 2つ続けると、HTTPヘッダが終了することを意味し、その次の
行から<HTML>タグを出力し始めます。
改行が 1つだと、HTTPヘッダの情報が続きます。
-----------------------------------------------------------------
print "Last-Modified: Wed, 05 Sep 2001 06:02:09 GMT\n";
print "Content-type:text/html\n\n";
print "<HTML>";
-----------------------------------------------------------------
HTTPヘッダについては、これ以上は説明しませんが、興味があれば自分で調べて
みてください。
さて、次に
print << "END_OF_HTML";
の部分ですが、これはEND_OF_HTMLという文字がくるまでprintを続けるという意味に
なります。
ですので、
-----------------------------------------------------------------
print << "END_OF_HTML";
<html>
・・・・・
</html>
END_OF_HTML
-----------------------------------------------------------------
と記述すると、END_OF_HTMLの文字までタグを出力し続けるわけです。
文字は「END_OF_HTML」でなくても構いません。
もちろん、
-----------------------------------------------------------------
print "Content-type:text/html\n\n";
print "<html>";
・・・・・
print "</html>";
-----------------------------------------------------------------
と書いても同じです。
★今日のまとめサンプルプログラム
-----------------------------------------------------------------
#! /usr/local/bin/perl
# 変数宣言ルールに変更
use strict;
# 宣言文
my ($a, $b);
my @week;
my $str = "test";
print "Last-Modified: Wed, 05 Sep 2001 06:02:09 GMT\n";
# ↑最終更新日をHTTPヘッダに出力。ただし、ブラウザからは何も見えない
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML
$a = 10;
$b = '20';
print $a + $b;
print '<br><br>';
@week = ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat') ;
foreach (@week) {
print $_ . '<br>';
}
print "<br>$str<br>";
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
■解説
use strictを記述し、変数宣言ルールにしています。
試しに宣言していない$cなどを記述してみてください。エラーになるのが確認できる
と思います。
また、HTTPヘッダについては、Content-typeだけ記述しておけば問題ないですが、
後々またHTTPヘッダについて出てくるので、頭の片隅に入れておいてください。
★課題
1. 以下のプログラムを、変数宣言が必要となるプログラムに変更してください。
-----------------------------------------------------------------
#! /usr/local/bin/perl
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML
$a = 10;
$b = '20';
$c = $a + $b;
$d = $a . $b;
print "\$c = $c<br>";
print "\$d = $d<br>";
@week = ('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat') ;
for ($i = 0; $i < $#week; $i++) {
print $week[$i] . '<br>';
}
%week = ('sun', '始まり', 'wed', '中日', 'fri', '週末') ;
print $week{sun} . '<br>';
print $week{wed} . '<br>';
print $week{fri} . '<br>';
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
★前回の課題の解答
1. 以下のデータをwhile文を使用してHTML中に表示してください。
%weekday =(
1=>'Sunday',
2=>'Monday',
3=>'Tuesday',
4=>'Wednesday',
5=>'Thursday',
6=>'Friday',
7=>'Saturday');
→下のサンプルを参照してください。
2. 以下のデータをハッシュ配列に格納し、HTML中に表示してください。
name : しょう
email : searchai@zw.main.jp
address : 東京都渋谷区
tel : 090-6934-9953
→下のサンプルを参照してください。
-----------------------------------------------------------------
#! /usr/local/bin/perl
print "Content-type:text/html\n\n";
print << "END_OF_HTML";
<HTML>
<BODY>
END_OF_HTML
# 1の解答例
%weekday =(
1=>'Sunday',
2=>'Monday',
3=>'Tuesday',
4=>'Wednesday',
5=>'Thursday',
6=>'Friday',
7=>'Saturday');
while ( ( $key , $value ) = each %weekday ){
print "$key : $value <br>\n" ;
}
print "<br>";
# 2の解答例
%data = ("name"=>"しょう",
"email"=>"searchai@zw.main.jp",
"address"=>"東京都渋谷区",
"tel"=>"090-6934-9953" );
foreach $key ( keys ( %data ) ) {
print "$key : $data{$key}<br>";
}
print << "END_OF_HTML";
</BODY>
</HTML>
END_OF_HTML
exit;
-----------------------------------------------------------------
■解説
ここでは、ハッシュ配列は基本的なところだけ抑えておけばOKです。
データベースを扱う時や、リクエストパラメータ(フォームから送られる情報)を
扱う時などに使用します。
ハッシュ配列のデータを、さらに配列にすることで、簡易的なデータベースとして
扱うことができます。
|