Perlでオブジェクト指向なプログラミングを行う時設定ファイルの扱いに困った。confファイルでも使おうかと思ったが、Settingクラスを作ってやったところ思いの外使い勝手が良かったので公開してみる。
Settingクラスは値の設定だけでなく外部の設定ファイルへのアクセスを行うメソッドを定義しておくことでメールのテンプレートや、禁止ワード等幅広い用途で外部の設定ファイルを素早く使う事ができる。
Settingクラス(Setting.cgi)のひな形
package Setting; # クラスのパッケージ名を宣言
sub new {
my $class = shift;
my $self= {
# 設定項目を適当に作る
setting1 => 'mogempoge',
setting2 => 'hogehoge.txt',
setting3 => 'hoguhogu.txt'
};
return bless $self , $class;
};
# テンプレートを記述したファイルから内容を読み取り変数に格納し、返すメソッド
sub read_config{
my $self = shift; #クラスプロパティ
$self->{ ConfigFile } = $_[0] if( @_ );
open(my $fh, "<", $self->{ ConfigFile }) || die("Can not open file $self->{ ConfigFile }");
my $file_contents;
while( my $line = readline $fh ){
$file_contents .= $line;
}
return $file_contents;
}
# 改行で区切られたワードを記述したファイルから内容を読み取り配列に格納し、返すメソッド
sub read_words {
my $self = shift; #クラスプロパティ
$self->{ ConfigFile } = $_[0] if( @_ );
open(my $fh, "<", $self->{ ConfigFile }) || die("Can not open file $self->{ ConfigFile }");
my @word_contents;
while( my $line = readline $fh ){
chomp($line); # 改行を削除
push(@word_contents, $line);
}
return \@word_contents;
}
1;
mainクラス(Test.cgi)のひな形
#!/usr/bin/perl
BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); }
# オプション関連の宣言
use strict;
use warnings;
# クラスを宣言
require "Setting.cgi";
require "Function.cgi";
# パッケージ名宣言
package main;
my $f_obj = Function->new();
$f_obj->function();
その他クラス(Function.cgi)で設定ファイルを読み込む場合のひな形
package Function; # クラスのパッケージ名を宣言
# コンストラクタを定義する時にSettingクラスを継承してあげる。
sub new {
# 引数を受ける
my ( $class, @args ) = @_;
my %args = ref $args[0] eq 'HASH' ? %{ $args[0] } : @args;
my $self = { %args }; #クラスプロパティ
# オブジェクト生成
$self = Setting->new();
return bless $self , $class;
};
sub function{
my $self = shift; #クラスプロパティ
# "setting1"の値を表示する
print $self->{ setting1 };
# テンプレート"setting2"の内容を変数で受け取り表示する
print $self->read_config( $self->{ setting2 } );
# ワードリスト"setting3"の一覧を配列で受け取り表示する
print $self->read_words( $self->{ setting3 } );
}
0 Comments.