Chinaunix首页 | 论坛 | 博客
  • 博客访问: 222186
  • 博文数量: 50
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 541
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-03 11:48
文章分类

全部博文(50)

文章存档

2010年(38)

2009年(12)

我的朋友

分类:

2010-04-20 00:04:12

##############################################################################

# Copyright (c) 2010-2099, Jacky Wei.

# Filename : ModifyFile.pm

# Sub_System : PERL

# Author : 魏彪

# Date : 2010-04-19

# Description : 该包,按照配置修改文件.

# History : 无

##############################################################################


package ModifyFile;
use strict;

my $equal = " = "; #等于符号,用于连接字符串使用

my $spacebar = "\t"; #空格字符,用于连接字符串使用


#这里和模块,不同的是,不用给出接口~(对外部可以被访问的函数)

sub new
{
 #构造函数,无参数

 my $this = {};
 bless $this;
 return $this;
}

sub ModifyFile
{
    shift @_;
    die "参数错误,退出程序" if @_ != 1;
    my $config = shift @_;
 
    foreach (keys ${$config})
    {
        #遍历文件(在设置文件中设置的文件)

  
        next if $_ eq "mainFile"; #如果为mainFile文件,就进入下一次循环

  
        my $fileName = $_;
        my @fileArray;
        my $fileDomain = "mainDomain"; #初始化文件域

  
    open FILE, "<$FileName" or die "打开文件失败.提示: "."$_"."出错 \n";
    while(<FILE>)
    {
        #匹配文件内容

        #my $allowPush = 1;

        if ($_ =~ /^[\#]|^\/\//)

        {
            #以#号开头或//开头的全部直接跳过

            push @fileArray;
        }
        else
        {
            if($_ =~ /^\[([a-zA-Z\d\_]+)\]/)
            {
                #域的名字只能是大小写字母和数字还有下划线

                $fileDomain = $1;
                push @fileArray,$_;
                #新增或设置成当前空间的块

            next;
            }
            elsif($_ =~ /^([\w\d\[\]]+)\s*\=\s*([\w\d\.]+)(\s*.*)/)
            {
                if (${$config}{$fileName}{$fileDomain}{$1})
                { #如果KEY存在

                    $_ = $1.$equal.${$config}{$fileName}{$fileDomain}{$1}.$3;
                }
                push @fileArray,$_;
                #增加键值,用于对比,具体参数

                #匹配: (参数 = 参数值 #说明)格式;

                    next;
            }
            elsif($_ =~ /^([\w\d]+)\s+([\w\d]+)\s+(\/[\w\d\/]+)(\s*.*)/)
            {
                my $argTemp;
                $argTemp = $1."\t".$2;
                #不知道\t可不可以做KEY值的一部分

                #${$config}{$fileName}{$fileDomain}{$argTemp} = $3;

                if (${$config}{$fileName}{$fileDomain}{$argTemp})
                { #判断config有无此设置

                    $_ = $argTemp.$spacebar.${$config}{$fileName}{$fileDomain}{$argTemp}.$3;
                }
                push @fileArray,$_;
                #把前两个字符相连做为键值,以确定唯一性

                #匹配:(参数名1 参数名2 参数值(可能是'/'开头) //说明)

                next;
            }
            elsif($_ =~ /^([\w\d]+)\s+([\w\d]+)\s+(\/\/[\w\d\/]+)(\s*.*)/)
            {
                #这里可能会和上面的重叠

                #print "$fileName---\n" unless($fileName);

                if (${$config}{$fileName}{$fileDomain}{$1})
                {
                    $_ = $1.$spacebar.${$config}{$fileName}{$fileDomain}{$1}.$spacebar.$3.$4;
                }
                push @fileArray,$_;
                next;
                #匹配 : (参数 参数值 //说明) 格式

            }
            elsif($_ =~ /^([\w\d]+)\s+([\w\d]+)(\s*.*)/)
            {
                #这里可能会和上面的重叠

                #print "$fileName---\n" unless($fileName);

                if (${$config}{$fileName}{$fileDomain}{$1})
                {
                    $_ = $1.$spacebar.${$config}{$fileName}{$fileDomain}{$1}.$spacebar.$3;
                }
                push @fileArray,$_;
         next;
                #匹配 : (参数 参数值) 格式

            }
            else
            {
                print "匹配有问题!请检查相关设置,参看相关说明!"."\n";
                open(ErrorFile,">>Error.txt");
                print ErrorFile $_."\n";
                #记录出错行以供错误检查

                close ErrorFile;
            }
        }
   
    }
  
    close FILE;
  
    #下面为写文件

    open FILE ">$fileName" or die "晕死,又出问题?!~?!~"."\n";
    print FILE foreach @fileArray;
    close FILE;
    #写文件结束

  
  
 }
}

1;


阅读(3911) | 评论(0) | 转发(0) |
0

上一篇:指针的指针

下一篇:HASH排序

给主人留下些什么吧!~~