Search A.I.
Menu
ホーム

メールマガジン ホームページプログラミングテク

Windowsテク
Javaアプレット サンプル
Java Q & A
JavaScript Q & A
Perl Q & A
Perl レッスン
PHP レッスン
PHPテク
MS-DOS コマンド集
UNIX コマンド集
SQL コマンド集
SEの基礎講座
WEBシステム開発受注します
]無料フォームメール送信サービス
リンク集
Perl レッスン

1. Perl の基礎
2. Perlの文法、条件式
3. Perlの文法、条件式 - 続き
4. 配列について
5. ハッシュ配列について
6. Perlの基礎 - 続き
7. 関数について
8. 関数について - 続き
9. 文字列操作関数
10. 配列操作関数
11. ファイル操作
12. ファイル操作 - 続き
13. パラメータの受け渡し
14. クッキーについて
15. 総合練習
16. メール送信
17. ファイルアップロード
18. パッケージの使用方法
19. MySQL
20. MySQL - 続き(1)
21. MySQL - 続き(2)
22. PostgreSQL
23. 総合練習
24. 総合練習解答



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です。

データベースを扱う時や、リクエストパラメータ(フォームから送られる情報)を
扱う時などに使用します。

ハッシュ配列のデータを、さらに配列にすることで、簡易的なデータベースとして
扱うことができます。




前の章へ 次の章へ


このエントリーをはてなブックマークに追加


OfficeLance

お問い合わせはこちらから