Perlサブルーチンbyとまて


1.ファイル入出力

sub fileinputに関しては、入力ファイル名と、変数名を指定してやると、テキストファイルのデータを行毎に変数名で指定した配列に読み込みます。

sub fileoutに関しては、出力ファイル名と、変数名、書き込みモード(上書きか、追加書き込みか)、書き込み開始データの配列の番号、書き込み終了データの配列の番号を指定してファイル出力するものです。

両方とも、ファイルオープンエラーかどうかを0,1のデータで返します。


このソフトのテストには、 の4つのファイルが必要です。また、各々パーミッションをcgiは"777"、データファイルは"666"のように設定して置いてください。実行後、"out1.txt"は"testinput.txt"と同じ内容に、"out2.txt"は3行目(配列は0から数えるので、[2]は3行目になります。)から6行目までのデータが書き込まれるはずです。

file_IO_test.cgi
#!/usr/local/bin/perl
# ************** file_IO_test.cgi *************

$me="file_IO_test.cgi";

# 使用する配列はサブルーチンをコールする前に作成しておく
@data=();

# ファイル入力サブルーチンをコールする
# testinput.txtの内容を@dataに入力する。
$errinp=&fileinput("testinput.txt","data");

# ファイル出力サブルーチンをコールする
# @dataの内容全てをout1.txtに上書き出力する
$errout1=&fileout("out1.txt","data",1);

# ファイル出力サブルーチンをコールする
# $data[2]〜$data[5]をout2.txtに追加出力する
$errout2=&fileout("out2.txt","data",0,2,5);

#=================================================================
# 画面へのテスト出力
print "Content-type: text/html\n\n";

print <<"HIA1";
<HTML>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=SHIFT_JIS" >
<HEAD>
<TITLE>テスト用</TITLE>
</HEAD>
<BODY>
ファイル入力成否=$errinp<BR>
@data<BR>
ファイル出力成否1=$errout1<BR>
ファイル入力成否2=$errout2<BR>
</BODY>
</HTML>
HIA1
#*****************************************************************
#=================================================================
# ファイル入力サブルーチン__ &fileinput(入力ファイル名,変数名)
#   ※サブルーチンを呼ぶ前に、@変数名=();など、配列をあらかじめ作っておく必要があります。

sub fileinput{
$err=0;

$filename=$_[0];
$hensuumei=$_[1];
    
   if ( !open (FILE_IO, $filename) ){
            $err=1;
    }
    else{
        @$hensuumei = <FILE_IO>;
        close(FILE_IO);
    }
        $cntend=@$hensuumei-1;
    for ($i=0;$i<=$cntend;$i++){
       $$hensuumei[$i]=~s/\r//g;
       $$hensuumei[$i]=~s/\n//g;
    }
    return($err);
}
#====================================================================
# ファイル出力サブルーチン__ &fileout(出力ファイル名,変数名,書き込みモード,start,end)
#    ※書き込みモードは、0:追加書き込み、1:上書き保存

sub fileout{
    $err=0;
    $filename=$_[0];
    $hensuumei=$_[1];
    $overwrite=$_[2];
    $istart=$_[3];
    $iend=$_[4];
    $cntend=@$hensuumei-1;
    
    if($istart eq "" && $iend eq ""){
        $istart=0;
        $iend=$cntend;
    }

    if($istart<0 || $istart>$iend || $iend>$cntend){
        $err=1;
    }else{

        if($overwrite==1){
            $openname=">".$filename;
        }else{
            $openname=">>".$filename;
        }

        # ファイルに格納する。
        if ( !open (FILE_IO, $openname) ){
            $err=1;
        }else{
           for ($i=$istart;$i<=$iend;$i++){
              print FILE_IO $$hensuumei[$i]."\n";
           }
           close (FILE_IO);
        }
    }
    return($err);
}