Perl -> サンプル

オブジェクトプログラミング

サンプルコード

  1. 設定ファイル Env.conf
  2. リクエストページ request.cgi
  3. UNIXコマンド実行モジュール (ControllerCommand.pm)
  4. ファイル読書きモジュール (ModelFile.pm)
  5. 共通モジュール (ControllerCommon.pm)

設定ファイル (~/cgi-bin/module/Env.conf)

package Env;
$LogDir = '/var/log';
$DatDir = '/data/dat';
  
  # モジュール内で変数を指定する場合以下のように記述する。
  # ${Env::LogDir}   * $LogDir = '/var/log';
  # ${Env::DatDir}   * $DatDir = '/data/dat';
  #   Env は pachage で指定した名前
  #   DatDir は変数名

リクエストページ (~/cgi-bin/request.cgi)

#!/usr/bin/perl

use strict;
use Switch;
use CGI;
use module::ControllerCommand;
use module::ModelFile;

my $prg_cmd = $0;
my $prg_dir = substr($prg_cmd, 0, rindex($prg_cmd, '/') + 1);

require "${prg_dir}/module/Env.conf";

# ./module/Env.conf を使わずに
# ${prg_dir}/module/Env.conf を指定する理由
# 相対パス(./cgi-bin/request.cgi) でも
# 絶対パス(/prg/web/cgi-bin/request.cgi)でも対応が可能。

#================================================#
# main                                           #
#================================================#
sub main {
    my $oCGI       = CGI->new();
    my $oCtrlCmd   = ControllerCommand->new();
    my $oModelFile = ModelFile->new();

    my $action;
    my $data;
    my $rtn;

    # URL が ./request.cgi?action=find&data=xxxx と指定された場合
    # 以下のようにパラメータを取得する。
    if(defined($oCGI->param('action'))){
        $action = $oCGI->param('action');
    }
    if(defined($oCGI->param('data'))){
        $data = $oCGI->param('data');
    }

    switch($action){
        case 'find'{
            $rtn=$oCtrlCmd->Find('backup','/bk');
        }
        case 'read'{
            $rtn=$oModelFile->Read('/log/user.log');
        }
        case 'write'{
            $rtn=$oModelFile->Write('/log/user.log',$dat);
        }
    }
}

&main();
exit(0);

UNIXコマンド実行モジュール (~/cgi-bin/module/ControllerCommand.pm)

#!/usr/bin/perl

package ControllerCommand;

use strict;
use module::ControllerCommon;
#------------------------------------------------#
# Class: ControllerCommand                       #
#------------------------------------------------#
sub new
{
    my $pkg      = shift;
    my $oCtrlCommon = ControllerCommon->new();
    my $obj = {
        oCtrlCommon => \$oCtrlCommon;
           
           # メソッド内でオブジェクトを使用する場合は
           # $this->{oCtrlCmmon} と指定するが、
           # この場合、\$oCtrlCommon はオブジェクトのリファレンスなので
           # ${$this->{oCtrlCmmon}} と指定する。
           # メソッドを書く場合は続けて ${$this->{oCtrlCmmon}}->メソッド名()
           
    };
    return bless $obj,$pkg;
}


#----------------------------------------#
# Method: FindFile                       #
#----------------------------------------#
sub Find {
    my $this = shift;
    my $dir  = shift;
    my @row;
    my $out;

    open(CMD,"find $dir -type f|");
    @row=;
    close(CMD);

    $out=${$this->{oCtrlCommon}}->Chomp(\@row)
    
      # $this->{oCtrlCommon} はオブジェクトのリファレンスなので、
      # オブジェクトを指定する場合は
      # ${}でさらに囲み ${$this->{oCtrlCommon}}->Chomp(\@row) になる
      # @row 配列のリファレンス $row が ${$row[n]} になるのと同じ。

    return $out;
}
1; ←パッケージの終わりには必ず必要

ファイル読書きモジュール (~/cgi-bin/module/ModelFile.pm)

#!/usr/bin/perl

package ModelFile;

use strict;
use module::ControllerCommon;
#------------------------------------------------#
# Class: ModelFile                               #
#------------------------------------------------#
sub new
{
    my $pkg         = shift;
    my $oCtrlCommon = ControllerCommon->new();
    my $obj = {
        oCtrlCommon => \$oCtrlCommon;
    };
    return bless $obj,$pkg;
}


#--------------------------------------#
# Method: Read                         #
#--------------------------------------#
sub Read {
    my $this = shift;
    my $file = shift;
    my @out;

    return 1 if(! -r ${file});

    open(FH,"$file");
    my @row=;
    close(FH);

    $out=${$this->{oCtrlCommon}}->Chomp(\@row)
    return $out;
}

#--------------------------------------#
# Method: Write                        #
#--------------------------------------#
sub Write {
    my $this = shift;
    my $file = shift;
    my $row  = shift;
    my $cnt=0;

    open(FH,">>$file");
    for(my $i=0;$i<@$row;$i++){
        print FH $$row[$i]."\n";
        $cnt++;
    }
    close(FH);
    return $cnt;
}
1;

共通モジュール (~/cgi-bin/module/ControllerCommon.pm)

#!/usr/bin/perl

package ControllerCommon;

use strict;
#------------------------------------------------#
# Class: ControllerCommon                        #
#------------------------------------------------#
sub new
{
    my $pkg         = shift;
    my $obj = {
    };
    return bless $obj,$pkg;
}


#--------------------------------------#
# Method: Chomp                        #
#--------------------------------------#
sub Chomp {
    my $this = shift;
    my $row  = shift;
    my @out;

    for(my $i=0;$i<@$row;$i++){
        chomp($$row[$i]);
        push(@out,$$row[$i]);
    }
    return \@out;
}
1;
      Document-Folder          一覧
HP-UX
HULFT
JAVA
JP1
JavaScript
Linux
MAC
PHP
Perl
Python
Ruby
SOA
Solaris
Unix全般
Windows
XML
エクセル
スタイルシート
セキュリティー
データベース
ネットワーク
パソコン
ブラウザ
プログラム構文
仮想化
          RSS-Folder
ニュース
   アットマーク・アイティ(@IT)
   シンクイット(ThinkIT)
   インターネットコム
   インターネットウォッチ
   日経IT-Pro
   日経パソコン
   CNET Japan
   ZD-NetJapan
   MYCOM
   RBB-Today
ベンダー
   日本IBM
   日本HP
   サンマイクロシステムズ
   NEC
   富士通
   日立
ソフトウェア
   マイクロソフト
   トレンドマイクロ
   オラクル
   サイボウズ
   Mozilla
   野村総合研究所
   (その他ソフトウェア企業)
更新履歴 一覧
 07/08 PERF
プログラム構文
 07/07 PERF
プログラム構文
 06/25 オブジェクトプログラミング2
Perl>サンプル
 07/12 クローン作成
仮想化>vCenter
 07/12 vyatta設定
ネットワーク>vyatta
 07/12 vyattaインストール
ネットワーク>vyatta
 07/12 リポジトリサーバ
Linux>サーバ構築
 07/05 VMwareのインストール
仮想化>VMware
 07/05 PXEブート
仮想化>KVM
 07/01 DHCPでのPXEブート
仮想化>KVM
 06/27 qcow2仮想DISK作成
仮想化>KVM
 06/13 NWの設定
仮想化>VMwareEsxi
 06/13 IPアドレスの変更
仮想化>VMwareEsxi
 06/12 自動ssh
Unix全般>シェル>Bash
 06/12 diffプログラミング
Python
Google