萌えPerl
しきり線
中項目 簡単な例2
リファレンスたん

 前のページで言ってた「萌えPerl」のサイト編集で実際に使っているものを載せておきます。


 萌えPerlのバックアップフォルダのルートディレクトリにて

1.edit_menu.pl というファイルをつくる。

2.以下を書き込む。
#!c:/perl/bin/perl
use strict;
use warnings;
use Data::Dumper;
use File::Find;

# テンプレート読込
my $tmpl = "C:\\moeperl\\01perl\\edit_menu.txt";
open(TMPL,$tmpl);
my @tmpl = <TMPL>;
close(TMPL);

# 指定したディレクトリ以下全てのファイルを編集
my @searchpath = ('C:\\moeperl\\01perl');
find(\&wanted, @searchpath);

exit(0);

##############
# subroutine #
##############

# ファイル一覧(再帰的に呼び出し)
sub wanted{
  if (/.html/){edit($File::Find::name)}
}

# 編集
sub edit{
  # ファイル読込
  my $file = shift;
  open(FILE,$file);
  my @html = <FILE>;
  close(FILE);
  # テンプレート置換
  my @html_e;
  my $edit_flag = 0;
  for (@html){
    if (/MoePerlLeftMenuStart/){
      $edit_flag=1;
      push (@html_e,@tmpl);
    }
    if ($edit_flag ne 1){push (@html_e,$_)};
    if (/MoePerlLeftMenuEnd/){$edit_flag=2};
  }
  # オミット制御
  if ($edit_flag eq 2){
    if ($file=~/j\w{3}.html/){
      my $key = makekey($file);
      for (@html_e){
        if (/id="$key"/){
          $_ =~ s/ class="sub"//;
        }
      }
    }
  }

  #ファイルアウトプット
  if ($edit_flag eq 2){
    open(OUT,"> $file");
    print OUT @html_e;
    close(OUT);
  }
}

sub makekey{
  my $file = shift;
  my $key;
  $file =~ /j(\d)\d{2}.html/;
  $key = $1;
  if ($key =~ /\d/){
    $key++;
  } else {
    my %alpha=('a'=>'11', 'b'=>'12', 'c'=>'13', 'd'=>'14',
 'e'=>'15', 'f'=>'16', 'g'=>'17', 'h'=>'18',
 'i'=>'19', 'j'=>'20',);
    $key = $alpha{$key};
  }
  $key = "submenu".$key;
  return $key;
}


3.edit_menu.txt というファイルを作る。

4.以下を書き込む。
<!-- MoePerlLeftMenuStart //-->
<TD class=left valign="top">

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href ="index.html"> トップページ</A><BR>
  </TD></TR></TABLE>
  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href ="map.html"> サイトマップ</A><BR>
  </TD></TR></TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu1 class=OFF onclick="menushow('menu1')" onkeypress="menushow('menu1')"> はじまりはじまり </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu1" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu"><A href ="j010.html">   はじめまして  </A></td></TR>
  <TR><TD class="submenu"><A href ="j020.html">   パールって何? </A></TD></TR>
  <TR><TD class="submenu"><A href ="j030.html">   なんでパール? </A></TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu2 class=OFF onclick="menushow('menu2')" onkeypress="menushow('menu2')"> まずは準備    </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu2" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu"><A href ="j110.html">   環境作り   </A></TD></TR>
  <TR><TD class="submenu"><A href ="j120.html">   プログラムとは</A></TD></TR>
  <TR><TD class="submenu"><A href ="j130.html">   書き方の基本 </A></TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu3 class=OFF onclick="menushow('menu3')" onkeypress="menushow('menu3')"> 変数・演算子   </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu3" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu"><A href ="j210.html">   変数配列ハッシュ</A></TD></TR>
  <TR><TD class="submenu"><A href ="j220.html">   リファレンス </A></TD></TR>
  <TR><TD class="submenu"><A href ="j230.html">   演算子    </A></TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu4 class=OFF onclick="menushow('menu4')" onkeypress="menushow('menu4')"> 条件・繰返    </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu4" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu"><A href ="j310.html">   条件文    </A></TD></TR>
  <TR><TD class="submenu"><A href ="j320.html">   繰り返し文  </A></TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu5 class=OFF onclick="menushow('menu5')" onkeypress="menushow('menu5')"> 正規表現・関数  </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu5" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu"><A href ="j410.html">   サブルーチン  </A></TD></TR>
  <TR><TD class="submenu"><A href ="j420.html">   正規表現    </A></TD></TR>
  <TR><TD class="submenu"><A href ="j430.html">   文字列の操作  </A></TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu6 class=OFF onclick="menushow('menu6')" onkeypress="menushow('menu6')"> ブラウザから入力 </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu6" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu"><A href ="j510.html">   フォーム   </A></TD></TR>
  <TR><TD class="submenu"><A href ="j520.html">   リンク    </A></TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu7 class=OFF onclick="menushow('menu7')" onkeypress="menushow('menu7')"> データファイル  </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu7" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu"><A href ="j610.html">   ディレクトリ </A></TD></TR>
  <TR><TD class="submenu"><A href ="j620.html">   ファイル操作 </A></TD></TR>
  <TR><TD class="submenu"><A href ="j630.html">   ロックファイル</A></TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu8 class=OFF onclick="menushow('menu8')" onkeypress="menushow('menu8')"> 応用・実用    </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu8" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu"><A href ="j710.html">   ファイル入出力</A></TD></TR>
  <TR><TD class="submenu"><A href ="j720.html">   データの記録 </A></TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu9 class=OFF onclick="menushow('menu9')" onkeypress="menushow('menu9')"> コマンドライン  </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu9" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu"><A href ="j810.html">   コマンドで操作</A></TD></TR>
  <TR><TD class="submenu"><A href ="j820.html">   簡単な例   </A></TD></TR>
  <TR><TD class="submenu"><A href ="j830.html">   簡単な例2  </A></TD></TR>
  </TABLE>

<!-- ちょい変更が多いので先のことはひとまずオミット

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu9 class=OFF onclick="menushow('menu10')" onkeypress="menushow('menu9')"> モジュール    </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu9" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu">   モジュール  </TD></TR>
  <TR><TD class="submenu">   リファレンス2</TD></TR>
  <TR><TD class="submenu">   ダンパー   </TD></TR>
  <TR><TD class="submenu">   テンプレート </TD></TR>
  <TR><TD class="submenu">   フィルイン  </TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu10 class=OFF onclick="menushow('menu10')" onkeypress="menushow('menu10')"> ウェブアプリとは </A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu10" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu">   単純だけど面倒</TD></TR>
  <TR><TD class="submenu">   セッション  </TD></TR>
  <TR><TD class="submenu">   バリデイト  </TD></TR>
  <TR><TD class="submenu">   サニタイズ  </TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu11 class=OFF onclick="menushow('menu11')" onkeypress="menushow('menu11')"> Flashとの連携  </A><BR>   </TD></TR></TABLE>
  <TABLE id="submenu11" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu">   インターフェイス</TD></TR>
  <TR><TD class="submenu">   データの受け渡し</TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu12 class=OFF onclick="menushow('menu12')" onkeypress="menushow('menu12')"> JavaScriptとの連携</A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu12" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu">   ajaxとやら   </TD></TR>
  <TR><TD class="submenu">   データの受け渡し</TD></TR>
  </TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href="javascript:void(0)" id=menu13 class=OFF onclick="menushow('menu13')" onkeypress="menushow('menu13')"> さらばプロバイダー</A><BR>
  </TD></TR></TABLE>
  <TABLE id="submenu13" class="sub" border="0" cellspacing="0" summary="サブメニュー">
  <TR><TD class="submenu">   独自ドメイン  </TD></TR>
  <TR><TD class="submenu">   レンタルサーバー</TD></TR>
  <TR><TD class="submenu">   自宅サーバー  </TD></TR>
  </TABLE>

//-->

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href ="profile.html"> プロフィール </A><BR>
  </TD></TR></TABLE>

  <TABLE class="menu" border="0" cellspacing="0" summary="メニュー"><TR><TD>
  <A href ="link.html"> リンク    </A><BR>
  </TD></TR></TABLE>
<DIV class="adsense">
<script type="text/javascript"><!--
google_ad_client = "pub-1711667252089735";
google_ad_width = 120;
google_ad_height = 600;
google_ad_format = "120x600_as";
google_ad_type = "text_image";
//2007-10-25: 萌えPerl
google_ad_channel = "3234662987";
google_color_border = "FFBBE8";
google_color_bg = "FFFFFF";
google_color_link = "FF6FCF";
google_color_text = "7F7F7F";
google_color_url = "0066CC";
google_ui_features = "rc:10";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</DIV>

</TD>
<!-- MoePerlLeftMenuEnd //-->

5.実行する。
C:\moeperl\01perl>perl edit_menu.pl
 このときのファイルの置いている場所とかはこんな感じです。
 サイトまるごと保管しているフォルダーなので、メニュー編集に関係の無いファイルも入っていますが、まあ大丈夫でしょう。
作業フォルダー

 実行している場面はこうです。
コマンドプロンプト

 いじょ。


リファレンスたん

解説。

 ちょっと激長でしたが、やっていることをまとめるとこうです。

@ edit_menu.pl が実行されると、まず edit_menu.txt に書いてある内容を見に行って覚える。
A自分の居るフォルダーとそれ以下のフォルダーの中身にあるファイルを次々に読みに行く。
B次々に読み込んだ時に、読んだファイルの中身で <!-- MoePerlLeftMenuStart //--><!-- MoePerlLeftMenuEnd //--> で挟まれた部分を@で覚えた内容と置き換える。
C 開いているファイル名を見て、サブメニューをオープン常態にすべきところをそのように書き換える。

 この中で、Aの部分。こういうのを「再帰的に処理する」とか言います。再帰的にっていうのは説明すると最初はややこしいんですが、「自分のディレクトリ内のファイルを順番に見ていって、フォルダーがあればそこを開いて中のファイルを順番に見ていって、またその中にフォルダーがあったら、……」というように、ネズミ講のように処理を繰り返してゆくこと。そして、その「フォルダーがあればその中を開いて見ていって」というような処理を繰り返す際に、1つのルーチンがその処理の途中に自分自身を呼び出してどんどん繰り返してゆくこと。大体はこの2つの特徴を持った処理を再帰的な処理といいます。
 自分で自分を呼び出してどんどん深みにはまっていって頭がこんがらがりそうになるし、終了条件をちゃんとしとかないと恐ろしい無限ループに陥ってしまうなど、上手にしないと凹みます。
 しかし、ファイルの一覧を再帰的に処理してゲットするには、File::Find というモジュールがあるので心配ありません。
 これは大体標準で入っているので普通に use File::Find; とすれば利用できます。
 モジュールについては後のコーナーで詳しく説明します。
 というわけで、何かの参考になればという程度のものですが、これにて失礼します。