Perlサブルーチンbyとまて


引数にテーブルタグを付けて返すサブルーチン

sub add_table は、CSV形式のデータ、もしくは表の1行分の項目を列挙して引数として渡すと、<TR>から</TR>までの一行分のテーブルタグを付加して返すサブルーチンです。
 データを列挙して引数渡しする場合、変数やデータを直に並べてもいいし、配列を使っても全く同様に動作するようです。
結果表示はここをクリックしてご覧下さい。


table_tag_test.cgi
#!/usr/local/bin/perl
# ************** test.cgi *************

$me="table_tag_test.cgi";

#--------------------↓テーブルタグの作成-------------------------

#-------------------
# 1.CSV型のデータの場合のサブルーチンコール

    $table1= "<TABLE BORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" BORDERCOLOR=\"green\" BGCOLOR=\"white\">\n";

    @lines=("2000年,平成12年,辰年","2001年,平成13年,巳年","2002年,平成14年,午年","2003年,平成15年,未年");
    $kugiri=",";
    $lines_num=@lines;

    for($k=0;$k<$lines_num;$k++){
         # サブルーチンコール部分
         $table1=$table1.&add_table(0,$kugiri,0,$lines[$k]);
    }

    # テーブルタグを閉じている。
    $table1=$table1.'</TABLE>';

#-------------------
# 2.データ列挙型のコールの場合

    # 単純に列挙する
    $table2= "<TABLE BORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" BORDERCOLOR=\"red\" BGCOLOR=\"white\">\n";
    $table2=$table2.&add_table(1,4,"初夢","富士","鷹","なすび");
    $table2=$table2.'</TABLE>';

    # 一行分のデータを、配列 (この場合は、@data)に入れてからコールする
    $table3= "<TABLE BORDER=\"1\" CELLSPACING=\"0\" CELLPADDING=\"2\" BORDERCOLOR=\"blue\" BGCOLOR=\"white\">\n";
    @data=("巨人","大鵬","たまごやき");
    $table3=$table3.&add_table(1,0,@data);
    $table3=$table3.'</TABLE>';

#--------------------↓ページの表示----------------------

print "Content-type: text/html\n\n";
print <<"HIA1";
<HTML>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=SHIFT_JIS" >
<HEAD>
<TITLE>テーブルタグ</TITLE>
<STYLE>
</STYLE>
</HEAD>
<BODY BGCOLOR="#ffffdd">
<H1>テーブルタグ作成サブルーチンのテスト</H1>


<HR>
<H3>1.CSV型のデータの場合のサブルーチンコール</H3>
$table1
<H3>2.データ列挙型のコールの場合(単純に列挙して引数渡し)</H3>
$table2
<H3>  (データを配列にしてから引数として渡す)</H3>
$table3

<HR>
</BODY>
</HTML>
HIA1
exit();

#--------------------↓ここから下はサブルーチン----------------------
#=================================================================
# テーブルタグ発生サブルーチン__ &add_table(引数)
#
#  1.CSVタイプのデータの場合
#     (0,CSVの区切り文字選択,表のカラム[列]の数,データ)
#     ※区切り文字は、0でカンマ,1でタブコード,2でスペース
#
#  2.変数名を並べて呼ぶ場合
#     (1,表のカラム[列]の数,変数1,変数2,変数3,変数4,…)
#     ※カラム数が0の場合は、実際の変数の数をカラム数にする
#

sub add_table{

$mode = $_[0];

    # 引数モードがCSVタイプの場合------------------------------------------------------
    if($mode==0){

        $switch=$_[1];
        $cols_num = $_[2];
        $data=$_[3];

        # 区切り文字でカラムデータを分割する
        if($switch==0){
            @cols=split(/\,/,$data);
        }elsif($switch==1){
            @cols=split(/\t/,$data);
        }elsif($switch==2){

            #スペースの連続している部分を1つにする
            while(-1 != index $data,"  "){
                $data=~ s/  / /g;
            }
            @cols=split(/\s/,$data);
        }

        # カラムの数が指定されていない場合はデータの数に合わせる
        if($cols_num == 0){$cols_num=@cols;}
    }

    # 引数モードが変数を並べて呼ぶタイプの場合----------------------------------------
    if($mode==1){

        $cols_num = $_[1];

        # カラム数が指定されて無い場合
        if($cols_num==0){$cols_num=@_-2;}

        # 各カラムのデータを挿入
        for($i=0;$i<$cols_num;$i++){$cols[$i]=$_[$i+2];}
    }

    # データにタグを挿入する
    $output1="<TR>";
    for($i=0;$i<$cols_num;$i++){
       $output1=$output1."<TD>".$cols[$i]."</TD>";
    }
    $output1=$output1."</TR>\n";

    return($output1);
}

 __END__