Perlスクリプトの基本メモその1〜CGIも〜

Perlスクリプトの基本メモその1。今回は主に大枠部分をメモ。CGIについても簡単に触れる。

シバン行とstrict、warningsモード設定

#!/usr/bin/perl
use strict;
use warnings;

念頭においておきたいこと

  • $ スカラー(単一の値)
  • @ リスト
  • % ハッシュ

評価コンテキスト

スカラーコンテキストとリストコンテキストがある。
例えば以下のとおり。

$x = @l; #xはスカラー変数のため、単一値(この場合はリストの長さ)が代入される
@x = @l; #xはリスト変数のため、リスト(この場合はlそのもの)が代入される

($h, @t) = @l; #こんなこともできる

スカラーコンテキストにするには以下の方法がある。

  • scalar関数の利用(逆にリストコンテキストにするには、split関数を利用)
  • スカラーを要求される文脈で使う

サブルーチンにおいて評価コンテキストを検知するには「wantarray」を利用する。

サブルーチン

定義
sub subname {
	#引数をプライベート変数に代入
	my ($param1 , $param2 , $param3) = @_;

	#処理

	#呼び出しのコンテキストに応じた値を返す
	if(wantarray) {
		return リスト値;
	}
	else {
		return スカラー値;
	}
}
呼び出し
  • 戻り値の代入先の変数に応じて、呼び出しコンテキストが決定される
  • 組み込み関数と違い、引数の括弧が必須(引数がない場合も)

変数スコープ

  • my プライベート変数を生成。推奨される
  • our グローバル変数を生成
  • local (新たな変数の生成ではなく、)指定した変数が別の値を保持できる新たなスコープを生成。スコープから抜けると、変数の値は元に戻る

モジュール

モジュール(.pm)のテンプレート

参考文献より抜粋。

package Module_name; #変数とサブルーチンをモジュールの名前空間に
use strict; #コンパイラが厳格なチェックを行う
use Carp; #ユーザ視点からエラーの位置を特定するモジュール

our (@ISA, @EXPORT, @EXPORT_OK); #このテンプレートの中で用いる変数

require Exporter; @ISA=( 'Exporter' ); #インポートとエクスポート

@EXPORT=qw( modele_vars module_subs ); #自動でエクスポートする
@EXPORT_OK=qw( module_vars module_subs ); #要求次第でエクスポートする

#
#モジュールの機能の実装
#

1; #真の値でモジュールの終了を示す
  • 「qw(a b)」は「('q', 'w')」と同等。(quote words)
  • warn は開発者目線、carp は利用者目線の行番号を出力
  • モジュールの構文チェックは「perl -wc filename.pm」にて
モジュールのインポート
use Module_name qw(module_vars module_subs);
  • require require実行時に読み込み
モジュールの命名
  • 大文字で始める
  • 階層構造は「::」で表現。そのままディレクトリ階層になる
  • 内部用のモジュールには、予約済みの Local::* カテゴリを使う

OSコマンドの実行

移植性を考えると、可能な限り使用しない方がよいだろうが。

コマンド展開
foreach $line ( `cat $filepath` ) {
	print "$line";
}
system関数(コマンドの実行結果をそのまま標準出力する場合はコチラ)
system "cat $filepath";

CGI

仕組み把握のため、あえてCGIモジュールを使わない場合をメモ。

最低限の記述
#!/usr/bin/perl
print "Content-type: text/html\n\n";
#これ以降標準出力に出力した内容がHTTPレスポンスのメッセージボディに入る
CGIのエラー内容をブラウザに返す設定
use CGI::Carp qw(fatalsToBrowser);

補足:シェルスクリプトCGI

#!/bin/sh
printf "Content-type: text/html\n\n"
#これ以降標準出力に出力した内容がHTTPレスポンスのメッセージボディに入る
GETパラメータ
  • 送信:URL末尾の?に続けて、値を + 区切りで指定。(ゆえにHTMLのFORMによるGETは使えない??)
  • 取得:コマンドラインパラメータと同様($1とか)にて取得可能
POSTパラメータ

参考文献

ミニマルPerl ―Unix/LinuxユーザのためのPerl習得法

ミニマルPerl ―Unix/LinuxユーザのためのPerl習得法