Perl Perl_2
Perl 「 モジュール 」 CGI 実用的なファイルアップロード 03 プロトタイプ (0x110)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x110 回。
CGI.pm で、実用的なファイルアップロードの処理を確認する。その 03 回。Perl の「 プロトタイプ 」について。
プログラム冒頭
Cgi upload - perlmeme.org で紹介されている、ファイルアップロードの実用的なコードの冒頭部分を確認します。
#!/usr/bin/perl -T
use strict;
use warnings;
use CGI;
# 本番で削除する
use CGI::Carp qw(fatalsToBrowser);
# アップロードファイルの最大サイズを 100k に設定
$CGI::POST_MAX = 1024 * 100;
# ファイル保存のためのサブルーチンを呼び出し
# 関数プロトタイプに $ ( スカラコンテキスト ) を 1 つ指定。
sub save_file($);
この中から、今回は、15 行目のサブルーチン「 save_file() 」で設定している「 プロトタイプ 」を確認します。
プロトタイプ
プロトタイプ ( prototype ) は、英語で「 原型 」「 試作品 」という意味があります。「 プロトタイプ 」と聞くと、何だか胸熱な感情が湧いてきますが、ここで確認するプロトタイプは、コンピュータープログラミングの「 関数プロトタイプ 」です。
「 関数プロトタイプ 」は、関数を定義する場合に、「 関数名 」「 引数の個数 ( arity ) 」「 引数のデータ型 」「 戻り値のデータ型 」を、関数本体の処理に先んじて予め宣言しておくものです。
これは、C 言語等、メインルーチン ( またはその関数を使うルーチン ) よりも前に、関数を定義しておく必要があるプログラミング言語で利用されます。なぜなら、プログラムがコンパイルされる時、コンパイラはファイルの上から順に解析するからです。
つまり、関数プロトタイプ宣言の記述を使えば、ファイル全体をより見通しの良いものに出来るということです。
脱初心者 C 講座 3 "関数:プロトタイプ宣言" - Middle Technologies' Lithograph
Perl でプロトタイプ宣言
Perl では、(0x2f) で確認した通り、「 ユーザが定義した関数 」を「 サブルーチン 」と呼称します。
Perl でも、(0x37) で確認した通り、サブルーチンに対する「 プロトタイプ宣言 」を利用可能です。しかしながら、それは、C 言語等の「 プロトタイプ宣言 」とは似て非なる ( ? ) 機能を提供すると言います。
(0x37) では、「 自作のモジュール等を作る様になるまでその詳細は棚に上げておきます。」としましたが、ここで確認することとなりました。
Perl のプロトタイプ宣言
perlsub "プロトタイプ" - perldoc.jp によれば、Perl のプロトタイプは、コンパイル時に "限られた引数チェック機能" を提供します。つまり、それはあまり厳密ではありません。
そもそも、Perl のプロトタイプの基本的な目的は、サブルーチン ( ユーザ定義の関数 ) を「 組込み関数の様に 」利用可能とすることなのだ、ということです。
プロトタイプ宣言を行ったサブルーチンは、シジル「 & 」なしで呼び出すことが出来ますが、反対にシジル「 & 」を付けて呼び出すと、プロトタイプ宣言をした引数の設定は無視されます。
実用的なファイルアップロードのためのプログラムでは、次の様に指定されています。
sub save_file($);
これは、サブルーチン「 save_file 」で、「 スカラコンテキスト 」の値を 1 つ取るという宣言です。実際の呼び出しと、その処理は、プログラムの後半部分で記述します。
ここでのポイントは、プロトタイプ宣言が、「 スカラの値 」ではなくて、「 スカラのコンテキスト 」を指定していることです。
つまり、例えば次の様に、「 $ 」でプロトタイプを宣言しているサブルーチンに、リストコンテキストで扱うべき配列変数を渡した場合、
# prototype $
sub printer($);
# array
my @values = qw/test01 test02 test03/;
# call
printer(@values):
# sub routine
sub perint($) {
print "@_\n";
}
結果として出力されるのは、スカラコンテキストで配列を扱った場合に返される、データの個数です。多くの場合、これは意図した動作と異なるはずなので、プロトタイプ宣言の利用にはやや注意が必要です
3
Perl のプロトタイプについてのより詳しい情報は、次の Web ページを参照してください。
perlsub "プロトタイプ" - perldoc.jp
Perl5編 "第 24 章 プロトタイプ" - Programing Place
Perl の (スカラ | リスト) コンテキストは、(0x1f) で確認しました。
0x110 -> 0x111 へ
次回は、HTML フォームの作成部分の内「 CGI オブジェクトの作成」と「 HTTP ヘッダの作成 」および「 HTML ヘッダの作成 」を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)