<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/wpa2_str/">
    <title>wpa2_str @ ウィキ</title>
    <link>http://w.atwiki.jp/wpa2_str/</link>
    <atom:link href="https://w.atwiki.jp/wpa2_str/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>wpa2_str @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2008-08-07T06:14:08+09:00</dc:date>
    <utime>1218057248</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/1.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/13.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/11.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/12.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/3.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/4.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/5.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/6.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/wpa2_str/pages/7.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/1.html</link>
    <description>
      *wpa2_str@ウィキって？
続わかめて用ツール[[wpa2_str.pm]]とその周辺を扱ったページです。

*wpa2_str.pmって？
wpa2とPerlを知らないと理解不能です…。

wpa2が新しい村ログをindex_village_data(以下ivd)に加えるのは時間がかかるけど、今までの村のログを見せずに新しい村ログだけからなる小さなivdを作るのは、そんなに時間はかからない。

だから新しい村ログだけの小さなivdをwpa2に作ってもらい、今までのでかいivdに追記するモジュールを作ればいいんじゃないだろうか。そしてそいつにwpa2_strという名前を与えてみよう。

*index_village_data
どこにアップしよう。誰かいいアップ場所教えて。
http://uproda11.2ch-library.com/　の　11108319.str　ivd-45001-45500.str
要wpa2_strモジュール、参考　http://www9.atwiki.jp/wpa2_str/

http://firestorage.jp/download/c7b93c10eb3413629d2f75b8a7bd6670a24e2595
ivd-1-45500.zip　wpa_*.txt

.strは次回45001-45750　wpa_*.txtは次回1-46000　を予定

*storableモジュールって
ネットワーク形式で保存させれば、これでも配布可能かなあ。いっそうコンパクトになるんだよね。

*tar+bz2形式のほうが
zipより小さくなる…。だんだんivdがでかくなってきてるから少しでも小さいやつ使いたい。

*誰か～
これって共同執筆人募るとどうなるんだろう。
でもどうやって募るんだろう。
それはそうといろいろ↓助けてオイス。
文句や突っ込み、要望もいいぜよ。

- さっそく後悔中。  -- 管理人  (2008-05-31 19:59:53)
- wpa2_strにどんな関数つけよ。  -- 管理人  (2008-05-31 20:00:23)
- そういやwpa2_pp.plなんてあったっけ。あっぷ。  -- 管理人  (2008-05-31 20:04:03)
#comment    </description>
    <dc:date>2008-08-07T06:14:08+09:00</dc:date>
    <utime>1218057248</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/13.html">
    <title>人狼BBSの君の日本語は間違ってる関係のヲチ</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/13.html</link>
    <description>
      一部削除 2008-06-10 (火) 10:54 - 君の日本語は間違っている

//削除報告板の方で終了された国のIDを取得できるとのお話があり、
ページ名に出ているIDをIDとして認知しかねます。個人ページとして
相応しいかどうかの判断が出来ずに消去されてしまうようなページで
ある事を作成者は把握なさっているのでしょうか。

一部削除 2008-06-10 (火) 13:51 - 君の日本語は間違っている
//wikiは誰でも編集できます。    </description>
    <dc:date>2008-06-10T14:50:15+09:00</dc:date>
    <utime>1213077015</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/11.html">
    <title>wpa2_str.pm</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/11.html</link>
    <description>
      package wpa2_str;
our $wpa2_dir = &quot;.&quot;;
#設定部はここまで-----------------------------------------

=head1 NAME

Wpa2_str - wpa2の補助

=head2 wpa2について

wpa2に付属のREADME.txtより引用させていただきます。

I&lt;WPA2は「汝は人狼なりや？」続わかめてサーバ
(L&lt;http://jinrou.dip.jp/~jinrou/&gt;)用の個人勝率集計ソフトウェアです。&gt;

作成者は☆ ◆LC7P44pfbgさんです。L&lt;http://www.geocities.jp/lc7p44pfbg/index.html&gt;にて入手できるようです。

=head2 Perlについて

プログラミング言語のひとつです。詳細は L&lt;http://www.perl.com/&gt;
もしくは L&lt;http://ja.wikipedia.org/wiki/Perl&gt; を参考にしてください。

=head1 概要

 use Wpa2_str;

 #活用例
 $wpa2_dir=&#039;.&#039;;	#wpa2のディレクトリを設定
 input_wpa2();	#デフォルトフォルダからwpa2データをメモリに入力
 change_memory();	#メモリの内容を退避メモリのものと交換
 input_wpa2(&#039;./ivd-1-43342&#039;);	#指定フォルダからwpa2データをメモリに入力
 merge_memory();	#退避メモリの内容をメモリのものに加える
 print_wpa2(&#039;./index_village_data_new&#039;);	#指定フォルダにwpa2形式でメモリの内容を出力

 #コマンドラインから例えば…。

prompt% perl -Mwpa2_str -e &quot;input_wpa2(&#039;index_village_data_new&#039;);change_memory();load_str(&#039;ivd-1-43451.str&#039;);merge_memory();print_wpa2();save_str(&#039;ivd-1-43472.str&#039;);&quot;

prompt% perl -Mwpa2_str -e &quot;load_str(&#039;ivd-1-43451.str&#039;);pickup_handle(&#039;^初日犠牲者$&#039;);print_wpa2();&quot;

 #その他
 save_str(&#039;./1-43420.str&#039;);	#指定ファイルにstr形式でメモリの内容を保存
 load_str(&#039;./1-43420.str&#039;);	#str形式の指定ファイルをメモリに読込
 backup_memory();	#メモリの内容を退避メモリにコピー
 Wpa2_str::help();	#このヘルプを表示…たぶん
 Wpa2_str::print_time(&#039;now...&#039;);	#時刻表示

=head1 説明

wpa2の補助用Perlモジュールです。
活用例では2つのwpa2データをまとめています。

=over

=item $wpa2_dir

 wpa2があるフォルダを指定します。デフォルト値は.です。

=cut
our ($start_time);
BEGIN{
	our ($start_time) = (times)[0];
}
use strict;
use warnings;
use Storable qw(nstore_fd fd_retrieve);
use List::Util qw(max);
use Data::Dumper;
use Exporter ();
use Clone qw(clone);
our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
@ISA = qw(Exporter);
@EXPORT = qw(input_wpa2 print_wpa2 load_str save_str change_memory backup_memory merge_memory pickup_handle $wpa2_dir);
@EXPORT_OK = qw(help print_time version);
$VERSION = &#039;1.12&#039;;
our	%fn = (
		&#039;cfg&#039;	=&gt; &#039;wpa_configure.txt&#039;,
		&#039;pl&#039;	=&gt; &#039;wpa_players.txt&#039;,
		&#039;plr&#039;	=&gt; &#039;wpa_players_rev.txt&#039;,
		&#039;tt&#039;	=&gt; &#039;wpa_titles.txt&#039;,
		&#039;idx&#039;	=&gt; &#039;wpa_index.txt&#039;,
		&#039;vt&#039;	=&gt; &#039;wpa_votes.txt&#039;,
		&#039;cmd&#039;	=&gt; &#039;wpa_commands.txt&#039;,
		&#039;ivd&#039;	=&gt; &#039;index_village_data&#039;,
		&#039;str&#039;	=&gt; &#039;ivd.str&#039;
	);
$fn{&#039;ivd&#039;}	= &quot;$wpa2_dir/$fn{&#039;ivd&#039;}&quot;;
our ($id_m, $plr_m, $ivd_m, $id, $plr, $ivd, %change);

=pod

=item input_wpa2([dir])

dirをindex_village_dataフォルダとみなして中のwpa_～.txtファイルの内容をメモリに入力します。dirのデフォルト値は$wpa2_dir/index_village_dataです。

=cut

sub input_wpa2{
	my($ivd_dir) = defined $_[0] ? $_[0] : $fn{ivd};
	my($key);
	for$key(&#039;pl&#039;,&#039;plr&#039;,&#039;tt&#039;,&#039;idx&#039;,&#039;vt&#039;,&#039;cmd&#039;){
		my ($fn) = &quot;$ivd_dir/$fn{$key}&quot;;
		&amp;print_time(&quot;input wpa2-type $fn&quot;);
		open F, &quot;&lt;$fn&quot; or die &quot;cannot open $fn&quot;;
		scalar &lt;F&gt;;
		if($key eq &#039;pl&#039;){
			&amp;input_pl;
		}elsif($key eq &#039;plr&#039;){
			&amp;input_plr;
		}else{
			&amp;input_ivd($key);
		}
		close F;
	}
}

sub input_pl{
	until(eof F){
		(scalar &lt;F&gt;) =~ /^(.+)\t(.*)$/;
		$id-&gt;{$2} = $1;
	}
}

sub input_plr{
	my ($f);
	until(eof F){
		$f = &lt;F&gt;;
		$f =~ /^([^\t]+)\t(.*)$/;
		$plr-&gt;[$1] = $2;
	}
}

sub input_ivd{
	my($key, $f, $v, $k) = $_[0];
	my %tmp;
	until(eof F){
		$f = &lt;F&gt;;
		$f =~ /^([^\t]+)\t(.*)$/;
		push @{$tmp{$1}}, $2;
	}
	while(($k, $v) = each %tmp){
		$ivd-&gt;{$k}-&gt;{$key} = $v;
	}
}

=pod

=item print_wpa2([dir])

input_wpa2と逆の働きをします。

=cut

sub print_wpa2{
	my($ivd_dir) = defined $_[0] ? $_[0] : $fn{ivd};
	my @ivd = sort {$b &lt;=&gt; $a} keys %{$ivd};
	my($key);
	for$key(&#039;pl&#039;,&#039;plr&#039;,&#039;tt&#039;,&#039;idx&#039;,&#039;vt&#039;,&#039;cmd&#039;){
		my ($fn) = &quot;$ivd_dir/$fn{$key}&quot;;
		&amp;print_time(&quot;print wpa2-type $fn&quot;);
		open F, &quot;&gt;$fn&quot; or die &quot;cannot open $fn&quot;;
		print F &quot;version\t2.0\n&quot;;
		if($key eq &#039;pl&#039;){
			&amp;print_pl;			
		}elsif($key eq &#039;plr&#039;){
			&amp;print_plr;
		}else{
			&amp;print_ivd($key, \@ivd);
		}
		close F;
	}
}

sub print_pl{
	my($n);
	foreach$n(sort {$id-&gt;{$a} &lt;=&gt; $id-&gt;{$b}} keys %{$id}){
		print F &quot;$id-&gt;{$n}\t$n\n&quot;;
	}
}

sub print_plr{
	my $max = $#{$plr};
	my($i);
	for($i=0; $i&lt;=$max; $i++){
		print F &quot;$i\t$plr-&gt;[$i]\n&quot; if defined $plr-&gt;[$i];
	}
}

sub print_ivd{
	my($k, $a_ivd, $i, $tmp, $line) = @_;
	foreach$i(@{$a_ivd}){
		$tmp = $ivd-&gt;{$i}-&gt;{$k};
		for$line(@{$tmp}){
			print F &quot;$i\t$line\n&quot;;
		}
	}
}

=pod

=item load_str([file])

str形式のfileをメモリに読み込みます。str形式の利点はstorableモジュールがもたらす高速性であり、特に読み込み時にはその特色が顕著に現れることでしょう。fileのデフォルト値はivd.strです。

=cut

sub load_str{
	my($fn) = defined $_[0] ? $_[0] : $fn{&#039;str&#039;};
	&amp;print_time(&quot;load str-type $fn&quot;);
	open G, &quot;&lt;$fn&quot; or die &quot;cannot open $fn&quot;;
	my($version) = fd_retrieve(\*G);
	load_str_1() if $$version == 1;
	close G;
}

sub load_str_1{
	$id = fd_retrieve(\*G);
	$plr = fd_retrieve(\*G);
	$ivd = fd_retrieve(\*G);
}

=pod

=item save_str([file])

load_strと逆の働きをします。

=cut

sub save_str{
	my($fn) = defined $_[0] ? $_[0] : $fn{&#039;str&#039;};
	my($version) = &#039;1&#039;;
	&amp;print_time(&quot;save str-type $fn&quot;);
	open G, &quot;&gt;$fn&quot; or die &quot;cannot open $fn&quot;;
	nstore_fd \$version, \*G;
	nstore_fd $id, \*G;
	nstore_fd $plr, \*G;
	nstore_fd $ivd, \*G;
	close G;
}

=pod

=item merge_memory()

退避用メモリの内容をメモリのものに加えます。先に小さいデータを読み込んでからchange_memoryを呼び出し、そして大きなデーターを読み込んだらmerge_memoryを呼んでください。退避用メモリの内容は破壊されます。


=cut

sub merge_memory{
	&amp;print_time(&quot;merge...&quot;);
	&amp;merge_new_id;
	&amp;merge_ivd;
}

sub merge_ivd{
	print_time(&quot;merge: player&#039;s id in all data changing...&quot;);
	my ($k, $line, @tmp);
	foreach$k(keys %{$ivd_m}){
		next if exists $ivd-&gt;{$k};
		$ivd-&gt;{$k} = $ivd_m-&gt;{$k};
		foreach$line(@{$ivd-&gt;{$k}-&gt;{idx}}){
#			next unless exists $change{0+$line};
			@tmp = split /\t/, $line;
			$tmp[0] = $change{$tmp[0]};
			$line = join &quot;\t&quot;, @tmp;
		}
	}
}

sub merge_new_id{
	&amp;print_time(&quot;merge: new player&#039;s id computing...&quot;);
	my ($new_id, $k, $v, $c, $n);
	$new_id = (max values %{$id}) + 1;
	foreach$k(keys %{$id_m}){
		unless(exists $id-&gt;{$k}){
			$id-&gt;{$k} = $new_id;
			$new_id++;
		}
		$v = $id_m-&gt;{$k};
		$c = $change{$v} = $id-&gt;{$k};
		if(defined $plr-&gt;[$c]){
#			print &quot;/$plr-&gt;[$c]\n+$plr_m-&gt;[$v]\n&quot; if $c;
			$plr-&gt;[$c] = join &quot;\t&quot;, $plr-&gt;[$c], (grep{
				$plr-&gt;[$c] !~ /^$_(?!\d)/
				and
				$plr-&gt;[$c] !~ /\t$_(?!\d)/
				}(split /\t/, $plr_m-&gt;[$v]));
#			print &quot;=$plr-&gt;[$c]\n\n&quot; if $c;
		}else{
			$plr-&gt;[$c] = $plr_m-&gt;[$v];
		}
#		&amp;print_time(&quot;$k&quot;);
	}
}

=pod

=item change_memory()

メモリの内容と退避用メモリのものを交換します。主にmerge_memory関数のために呼び出されることでしょう。ちなみに退避用メモリにアクセスするのは*_memory関数だけです。

=cut

sub change_memory{
	($id_m, $plr_m, $ivd_m, $id, $plr, $ivd) = ($id, $plr, $ivd, $id_m, $plr_m, $ivd_m);
}

=pod

=item backup_memory()

メモリの内容を退避用メモリにコピーします。

=cut

sub backup_memory{
	($id_m, $plr_m, $ivd_m) = (clone($id), clone($plr), clone($ivd));
}


=pod

=item pickup_handle(handle pattern)

メモリ内容をハンドルパターンに合致するプレイヤー専用のものに絞ります。パターンはPerlの正規表現です。

=cut

sub pickup_handle{
	my ($pattern) = (@_);
	my ($k, %id_list, %v, %id_del);
	print_time(&quot;pickup: player search...&quot;);
	foreach$k(keys %{$id}){
		if($k =~ /$pattern/o){
			$id_list{$id-&gt;{$k}}=1;
			print_time(&quot;find! $k&quot;);
		}else{
#			$plr-&gt;[$id-&gt;{$k}] = &#039;&#039;;
		}
	}
	print_time(&quot;pickup: village number search...&quot;);
	foreach$k(keys %id_list){
		foreach(split/\t/,$plr-&gt;[$k]){$v{$_}++;}
	}
	foreach$k(keys %{$ivd}){
		delete $ivd-&gt;{$k} unless defined $v{$k};
	}
	foreach$k(0..$#{$plr}){
		my $tmp = 0;
		foreach(split/\t/, $plr-&gt;[$k]){
			if(defined $v{$_}){
				$tmp = 1;
				last;
			}
		}
		unless($tmp){
			undef $plr-&gt;[$k];
			$id_del{$k} = 1;
		}
	}
	foreach$k(keys %{$id}){
		if(defined $id_del{$id-&gt;{$k}}){
			$plr-&gt;[$id-&gt;{$k}] = undef;
			delete $id-&gt;{$k};
		}else{
#			print &quot;$k\n&quot; if $id_list{$id-&gt;{$k}};
			next if $id_list{$id-&gt;{$k}};
			$plr-&gt;[$id-&gt;{$k}] = join&quot;\t&quot; ,
				grep{defined $v{$_}}
				split /\t/,
				$plr-&gt;[$id-&gt;{$k}];
		}
	}
}

=pod

=item help()

このモジュールのPODを表示する…はず。

=cut

sub help{
	system &#039;perldoc&#039;, &#039;wpa2_str.pm&#039;;
}

=pod

=item print_time()

時間や時刻を表示します。表示形式は変更する可能性があります。

=cut

sub print_time{
	printf STDERR &quot;%2d:%02d:%02d#%.2fs#$_[0]\n&quot;, reverse ((times)[0], (localtime)[0..2]);
}

sub END{
	print_time(&quot;end...&quot;);
}
return 1;
__END__

=pod

=back


=head1 お断り

使用は自己責任でよろしくお願いします。

=head1 将来の展望

 wpa2_ppの機能を取り入れたい
 良いスクリプトアップロード場所を見つけたい
 PODの書き方をなんとかしたい
 ログ出力先のコントロール関数追加
 メモリの内容を絞り込む機能追加
 wpa2.exeを呼び出せるように

=head1 履歴

=over

=item v1.12 2008/06/09 pickup_handleにwpa_players_rev.txtを絞る機能を加える

=item v1.11 2008/06/04 merge_new_id関数の高速化、List::MoreUtilsモジュールの不要化

=item v1.10 2008/06/04 pickup_handleの新設

=item v1.00 2008/05/30

=back

=head1 謝辞

 wpa2の作成者☆ ◆LC7P44pfbgさん
 続わかめて運営者のココアさん
 ココアさんなどを支えるサブ運営者のみなさん
 出会えたプレイヤーのみなさん

ありがとうございます。

=head1 連絡

2chの汝は人狼なりや関係スレッドにてwpa2_strの名前を出していただければ
検索で気づけるかも…です。

=cut

#wpa2_str---------------------------------------------end/
__END__
pod2html wpa2_str.pm --outfile wpa2_str.htm    </description>
    <dc:date>2008-06-09T13:18:59+09:00</dc:date>
    <utime>1212985139</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/12.html">
    <title>wpa2_pp.pl</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/12.html</link>
    <description>
      #wpa2 Pre Processer---------------------------------------

$wpa2_dir = &quot;.&quot;;
$pp_dir = &quot;./pp_namini&quot;;
$from_pp_to_wpa2_path = &quot;..&quot;;
#設定部はここまで-----------------------------------------
=pod

=head1 wpa2_pp 1.0

wpa2の補助用Perlスクリプトです。
もしかしたら作業が速く済む…かも。

=head2 wpa2について

wpa2に付属のREADME.txtより引用させていただきます。

I&lt;WPA2は「汝は人狼なりや？」続わかめてサーバ
(L&lt;http://jinrou.dip.jp/~jinrou/&gt;)用の個人勝率集計ソフトウェアです。&gt;

作成者は☆ ◆LC7P44pfbgさんです。

L&lt;http://www.geocities.jp/lc7p44pfbg/index.html&gt;にて入手できるようです。

=head2 Perlについて

プログラミング言語のひとつです。詳細は L&lt;http://www.perl.com/&gt;
もしくは L&lt;http://ja.wikipedia.org/wiki/Perl&gt; を参考にしてください。

=head1 使い方

これ以降の解説はwpa2とPerlについての知識を前提にしています。

=over

=item ０．indexファイル全てに読み取り専用属性を設定して下さい（推奨）

=item １．wpa2用フォルダ内にppフォルダを作成して下さい

=item ２．ppフォルダ内にwpa_configure.txtをコピーして下さい

=item ３．wpa2_pp.plをwpa2用のフォルダにおいて下さい

=item ４．wpa2用フォルダ内でwpa2_pp.plを実行してください

=back

=head2 動作

=over

=item １．ppフォルダ内にindex_village_dataフォルダを作成します

=item ２．ppフォルダ下のindex_village_dataフォルダ内に
ppフォルダ下のwpa_configure.txt向きに特化したindexファイルを作成します

=item ３．ppフォルダからwpa2.exeを呼び出します

=item ４．終了します

=back

=head1 その他

=head2 謝辞

=over

=item wpa2の作成者☆ ◆LC7P44pfbgさん

=item 続わかめて運営者のココアさん

=item ココアさんなどを支えるサブ運営者のみなさん

=item 出会えたプレイヤーのみなさん

=back

ありがとうございます。

=head2 連絡

2chの汝は人狼なりや関係スレッドにてwpa2_ppの名前を出していただければ
検索で気づけるかも…です。

=head2 お断り

使用は自己責任でよろしくお願いします。

=head2 展望

=over

=item 複数のppフォルダを逐次処理したい

=item 既に作成された特化indexファイルがあれば活用したい

=item バグがあれば見つけたい

=item 良いスクリプトアップロード場所を見つけたい

=item PODの書き方をなんとかしたい

=back

=head2 履歴

=over

=item v1.0 2008/04/01 組んで見たら意外とあっさりいったので公開

=back

=cut

#説明はここまで-------------------------------------------
&amp;print_time(&quot;start and configure open&quot;);
&amp;init(\%argv, @ARGV);
&amp;pp() if exists $argv{pp};
&amp;marge() if exists $argv{marge};
exit;

sub marge{
	
	die @_;
}

sub init{
	my ($argv, @argv) = @_;
	%fn = (
		&#039;cfg&#039;	=&gt; &#039;wpa_configure&#039;,
		&#039;pl&#039;	=&gt; &#039;wpa_players&#039;,
		&#039;plr&#039;	=&gt; &#039;wpa_players_rev&#039;,
		&#039;idx&#039;	=&gt; &#039;wpa_index&#039;,
		&#039;tt&#039;	=&gt; &#039;wpa_titles&#039;,
		&#039;vt&#039;	=&gt; &#039;wpa_votes&#039;,
		&#039;cmd&#039;	=&gt; &#039;wpa_commands&#039;,
		&#039;ivd&#039;	=&gt; &#039;index_village_data&#039;,
	);
	foreach(@argv){
		if(/-(\w+)/i){
			$key = lc $1;
			@{$argv-&gt;{$key}} = ();
		}else{
			push @{$argv-&gt;{$key}}, $_;
		}
	}
	if($#argv == -1 or exists $argv-&gt;{h}){
		system &#039;perldoc&#039;, $0;
		die;
	}
	$pp_dir = $argv-&gt;{dir}-&gt;[0] || $pp_dir;
	$wpa2_dir = $argv-&gt;{path}-&gt;[0] || $pp_dir;
	$read_dir = &quot;$wpa2_dir/$fn{ivd}&quot;;
	$write_dir = &quot;$pp_dir/$fn{ivd}&quot;;
#	print %argv;
}

sub pp{
	die &quot;pp ok&quot;;
	mkdir $write_dir;
	&amp;print_time(&quot;configure open&quot;);
	open CFG, &quot;&lt;$pp_dir/$fn{cfg}.txt&quot; or die;
	while(($_ = &lt;CFG&gt;) ne undef){
		if(/^(\w+)[\s\t]+(.*)/){
			push @{$cfg{$1}}, $2;
		}
	}
	$query = join &#039;|&#039;, map{&quot;(&quot; . (quotemeta $_) . &quot;)&quot;}@{$cfg{&#039;handle_name&#039;}};
	close CFG;
	
	&amp;print_time(&quot;players open&quot;);
	open PL, &quot;&lt;$read_dir/$fn{pl}.txt&quot;;
	push @pl_txt, scalar &lt;PL&gt;;
	while(($_ = &lt;PL&gt;) ne undef){
		($num, $name) = /^(\d+)\t(.*)$/;
		$name[$num] = $name;
		if($name =~ /$query/){
			$pl{$num} = 1;
			print &quot;handle found:$num - $name\n&quot;;
		}
	}
	close PL;
	#print &quot;players max:$num\n&quot;;
	
	&amp;print_time(&quot;players_rev open&quot;);
	open PLR, &quot;&lt;$read_dir/$fn{plr}.txt&quot;;
	push @plr_txt, scalar &lt;PLR&gt;;
	while(($_ = &lt;PLR&gt;) ne undef){
		($num, $plr) = /^(\d+)\t(.*)$/;
		$plr[$num] = $plr;
		if(exists $pl{$num}){
			map{$plr{$_} = 1;}split /\t/, $plr;
		}
	}
	close PLR;
	#print &quot;plr max:$num\n&quot;;
	
	&amp;print_time(&quot;index open&quot;);
	open IDX, &quot;&lt;$read_dir/$fn{idx}.txt&quot; or die;
	open PP, &quot;&gt;$write_dir/$fn{idx}.txt&quot; or die;
	print PP scalar &lt;IDX&gt;;
	while(($_ = &lt;IDX&gt;) ne undef){
		($vlg, $idx) = /^(\d+)\t(.*)$/;
		if(exists $plr{$vlg}){
			($pl, $rol, $die, $day) = (split /\t/, $idx);
			$pl2{$pl} = 1;
			print PP &quot;$vlg\t$idx\n&quot;;
		}
	}
	close IDX;
	close PP;
	#print &quot;index max:$vlg\n&quot;;
	
	foreach$filename(@fn{tt, vt, cmd}){
		&amp;vlg_serch($filename);
	}
	
	&amp;print_time(&quot;players and players_rev write&quot;);
	open PL, &quot;&gt;$write_dir/$fn{pl}.txt&quot; or die;
	open PLR, &quot;&gt;$write_dir/$fn{plr}.txt&quot; or die;
	print PL @pl_txt;
	print PLR @plr_txt;
	foreach$num(sort{$a&lt;=&gt;$b}keys %pl2){
		print PL &quot;$num\t$name[$num]\n&quot;;
		next unless exists $pl{$num};
		print PLR join(&quot;\t&quot;, $num, grep{exists $plr{$_}}(split /\t/, $plr[$num]));
		print PLR &quot;\n&quot;;
	}
	close PL;
	close PLR;
	
	chdir $pp_dir;
	&amp;print_time(&quot;wpa2 Pre Process end and start wpa2, good luck.&quot;);
	system &quot;$from_pp_to_wpa2_path/wpa2.exe&quot;;
	exit;
}
	
sub vlg_serch{
	my $filename = shift @_;
	&amp;print_time(&quot;$filename open&quot;);
	open DT, &quot;&lt;$read_dir/$filename.txt&quot; or die;
	open PP, &quot;&gt;$write_dir/$filename.txt&quot; or die;
	print PP scalar &lt;DT&gt;;
	while(($_ = &lt;DT&gt;) ne undef){
		($vlg, $dt) = /^(\d+)\t(.*)$/;
		if(exists $plr{$vlg}){
			print PP &quot;$vlg\t$dt\n&quot;;
		}
	}
	close DT;
	close PP;
#	print &quot;$filename max:$vlg\n&quot;;
}

sub print_time{
	printf &quot;%2d/%2d %2d:%02d:%02d :$_[0] time\n&quot;, (reverse localtime)[4..9];
}
#wpa2 Pre Processer------------------------------------end/
__END__
おまけ
perl -e&quot;open G,&#039;&lt;wpa_players.txt&#039;;while(&lt;G&gt;)
{@g=split/\t/;$p{$g[0]}=$g[1]}open F,&#039;&lt;wpa_players_rev.txt&#039;;while(&lt;F&gt;){@f=split/
\t/;$n{$f[0]}=$#f}print map{qq/$n{$_}\t$p{$_}/}sort{$n{$b}&lt;=&gt;$n{$a}}keys%n&quot;&gt;test
.txt    </description>
    <dc:date>2008-05-31T20:03:29+09:00</dc:date>
    <utime>1212231809</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/2.html</link>
    <description>
      **メニュー
-[[トップページ]]
-[[メニュー]]
-[[wpa2_str.pm]]

**更新履歴
#recent(20)

----

**リンク
-[[@wiki&gt;&gt;http://atwiki.jp]]
-[[@wikiご利用ガイド&gt;&gt;http://atwiki.jp/guide/]]

**他のサービス
-[[無料ホームページ作成&gt;&gt;http://atpages.jp]]
-[[無料ブログ作成&gt;&gt;http://atword.jp]]
-[[無料掲示板レンタル&gt;&gt;http://atbbs.jp]]
-[[2ch型掲示板レンタル&gt;&gt;http://atchs.jp]]
-[[お絵かきレンタル&gt;&gt;http://atpaint.jp/]]

// リンクを張るには &quot;[&quot; 2つで文字列を括ります。
// &quot;&gt;&quot; の左側に文字、右側にURLを記述するとリンクになります



&amp;link_editmenu(text=ここを編集)    </description>
    <dc:date>2008-05-31T19:58:43+09:00</dc:date>
    <utime>1212231523</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/3.html">
    <title>右メニュー</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/3.html</link>
    <description>
      **更新履歴
#recent(20)


&amp;link_editmenu2(text=ここを編集)
    </description>
    <dc:date>2008-05-31T19:21:09+09:00</dc:date>
    <utime>1212229269</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/4.html">
    <title>プラグイン/ニュース</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/4.html</link>
    <description>
      * ニュース
@wikiのwikiモードでは
 #news(興味のある単語)
と入力することで、あるキーワードに関連するニュース一覧を表示することができます
詳しくはこちらをご覧ください。
＝＞http://atwiki.jp/guide/17_174_ja.html


-----


たとえば、#news(wiki)と入力すると以下のように表示されます。


#news(wiki)
    </description>
    <dc:date>2008-05-31T19:21:09+09:00</dc:date>
    <utime>1212229269</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/5.html">
    <title>プラグイン/編集履歴</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/5.html</link>
    <description>
      * 更新履歴
@wikiのwikiモードでは
 #recent(数字)
と入力することで、wikiのページ更新履歴を表示することができます。
詳しくはこちらをご覧ください。
＝＞http://atwiki.jp/guide/17_117_ja.html


-----


たとえば、#recent(20)と入力すると以下のように表示されます。


#recent(20)
    </description>
    <dc:date>2008-05-31T19:21:09+09:00</dc:date>
    <utime>1212229269</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/6.html">
    <title>プラグイン/アーカイブ</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/6.html</link>
    <description>
      * アーカイブ
@wikiのwikiモードでは
 #archive_log()
と入力することで、特定のウェブページを保存しておくことができます。
詳しくはこちらをご覧ください。
＝＞http://atwiki.jp/guide/25_171_ja.html


-----


たとえば、#archive_log()と入力すると以下のように表示されます。
保存したいURLとサイト名を入力して&quot;アーカイブログ&quot;をクリックしてみよう


#archive_log()
    </description>
    <dc:date>2008-05-31T19:21:09+09:00</dc:date>
    <utime>1212229269</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/wpa2_str/pages/7.html">
    <title>プラグイン/動画(Youtube)</title>
    <link>https://w.atwiki.jp/wpa2_str/pages/7.html</link>
    <description>
      * 動画(youtube)
@wikiのwikiモードでは
 #video(動画のURL)
と入力することで、動画を貼り付けることが出来ます。
詳しくはこちらをご覧ください。
＝＞http://atwiki.jp/guide/17_209_ja.html

また動画のURLはYoutubeのURLをご利用ください。
＝＞http://www.youtube.com/

-----


たとえば、#video(http://youtube.com/watch?v=kTV1CcS53JQ)と入力すると以下のように表示されます。


#video(http://youtube.com/watch?v=kTV1CcS53JQ)

    </description>
    <dc:date>2008-05-31T19:21:09+09:00</dc:date>
    <utime>1212229269</utime>
  </item>
  </rdf:RDF>
