exp777.hatenablog.com

頭の中はゲームでいっぱい

データは分けよう

今日は一日中perlのプログラミングをした。なんでもポケモン図鑑をいじってた。
ソースからデータ部分を抜き出して外部ファイル化。Config::Simpleがすごく便利そうだったんだけど、自分のパソコンでもInfoseekでも使えなかった。なければ作ればいいじゃない、ということで自作。連想配列正規表現を最初から使えるとファイルから読み込むのも作りやすい。
せっかく作ったんだし掲載しよう。

Key = Value1,Value2

みたいなデータを作って、

use constant SPLITTER => ","; # 区切りの文字

# 設定ファイルを読み出す
# 引数1: ファイル名
# 返り値: 設定データを格納した連想配列
sub readConfig
{
	my $filename = $_[0];
	my $FILE;
	open(FILE, "<$filename") || die("Sorry, I could not open to read the file.");
	my %config;
	while(defined(my $line = <FILE>))
	{
		my $key = $line;
		$key =~ s/[ \t]*=[ \t]*.*//;
		$key =~ s/[\n\r]//g;
		my $value = $line;
		$value =~ s/.+[ \t]*=[ \t]*//;
		$value =~ s/[\n\r]//g;
		push(@{$config{$key}}, split(SPLITTER, $value));
	}
	return %config;
}

# 設定データを取得
# 引数1: キー
# 引数2: 設定データを格納した連想配列の参照
# 返り値: キーに対応した値
sub getConfigData
{
	my ($key, $config) = @_;
	my @values = @{$$config{$key}};
	if(@values == 1)
	{
		return $values[0];
	}
	else
	{
		return @values;
	}
}

これでロードして取得する。

my %config = &readConfig("config.txt");
my @data = &getConfigData("Key", \%config);
print @data; # たぶんValue1とValue2が出てくる

キーに対応した配列が取得できる。配列じゃなくていいならもっとシンプルになるね。
readConfigのsplitをもっと凝ったものにすれば設定ファイルの書式が本格的になりそう。これだとValue1とValue2の間にスペースを入れたりできない。これだったら

split(/[ \t]*,/, $value)

でいけるか?試してはいない。実際使ってるのはこれよりもっとチープなんだけどね。
これを書いていて思ったけど、perlのサブルーチンのコメントってどう書くのが一般的なのだろう。仮引数がないので、この引数はこれ、みたいな書き方ができない。あと、もっとかっこいいネーミングにしたい。


それにしても、なんでもポケモン図鑑みたいなプログラムだと、一度公開したら修正が難しい。下手にやったら結果が変わってしまう。こうかい*1する前に何度もチェックしないといけないと痛感した。
結果を変えないのに、何で修正してるんだろね。

*1:公開、後悔