Perl解析RC,RC2文件

前端之家收集整理的这篇文章主要介绍了Perl解析RC,RC2文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们正在开发的一个软件是国际化软件,所以需要翻译成其他国家的语言。但是对每一次更新实际上需要改动的语言只是一部分,其他一大部分是可重用的。

所以,为了避免代理商再次翻译,我们从原来的版本资源文件抽出了对应的字典文件,并进行替换,达到只翻译一部分改变了的字符串。

这其他还希望用到模糊匹配,但是效果似乎不大,不过还是很有必要的。关于模糊匹配,我看到了《编程之美》里面的一个题目:“判断字符串的相似度”。与这个类似。 以下是部分Perl写的代码: [pl] #根据RC,RC2文件构造字典需要输入两个文件,利用控件ID来对应

 1 #!/usr/bin/perl -w
 2 use strict;  3 use warnings;  4 
 5 
 6 #根据RC,RC2文件构造字典需要输入两个文件,利用控件ID来对应  7 
 8 ##################  9 #解析.rc2文件
 10 sub readRc2File  11 {  12    my $currentLine = 0 ;####读到492多行,addcount=382时的时候竟然结束了!
 13    my $fileName = shift;  14    my $hash_ref = shift ;  15    my $encoding = shift ;  16    my $fd ;  17    my $addCount = 0 ;  18    if( $encoding )  19  {  20       open $fd,"<:utf8",$fileName or die "openFile $fileName error!";  21    }else{  22       open $fd,$fileName or die "openFile $fileName error!";  23  }  24    my $begin = 0 ;   #begin开始标志位
 25    my $mul_begin = 0 ; #/**/开始标志位
 26    my $str = "";  27    while(<$fd>)  28  {  29       #$currentLine++;  30  #print "$currentLine: $_";  31  #过滤多行注释
 32       if( m#^\s*/\*# )#if begin with: /* #这里会有问题!当字符串“”里面有注释的时候就会挂-_-!!!所以!必须得开头!
 33  {  34            $mul_begin = 1 ;  35  }  36       if($mul_begin)  37  {  38          if( m#.*\*/# ) #if end width */
 39  {  40             #print "Current Line:$currentLine";#addCount = 1670出问题
 41             $mul_begin = 0 ;  42  }  43  }  44       else
 45  {  46         #在BEGIN\n与END\n里面的就是我们需要的字符串 ##这里出要求BEGIN开头,避免字符串里面出现BEGIN
 47         if( m/^\s*BEGIN/ )  48  {  49             $begin = 1 ;  50  }  51         else{  52             if( $begin )  53  {  54                 if( /^END/ )  55  {  56                     $begin = 0 ;  57  }  58                 else
 59  {  60                     #处理数据  61  #过滤单行注释 
 62                     if( !m=^\s*(//|#)= ) # if begin with // or #
 63  {  64                          #处理真正的数据
 65                          if( m#^[\s|\t]*(\w+)[\s|\t]+"(.+)"# )
 66  {  67                               if( !exists( $$hash_ref{$1} ) )  68  {  69                                  $$hash_ref{$1} = $2 ;  70                                  $addCount++;  71  }  72  }  73  }  74  }  75  }  76  }  77  }  78  }  79 }  80 
 81 ##################  82 #解析.rc文件,.rc文件与.rc2文件不同的地方在于:控件ID在“字符串”后面 ,例如:"C&ounter_Clockwise",IDC_ADVANCE_CCW  83 #rc与文件有点不同
 84 sub readRcFile  85 {  86    my $addCount = 0 ;  87    my $fileName = shift;  88    my $hash_ref = shift ;  89    open my $fd,"< ",$fileName or die "openFile $fileName error!";  90    my $begin = 0 ;  91    my $mul_begin = 0 ; #/**/开始标志位
 92    my $str = "";  93    while(<$fd>)  94  {  95       #过滤多行注释
 96       if( m#^\s*/\*# )#if begin with: /* #这里会有问题!当字符串“”里面有注释的时候就会挂-_-!!!所以!必须得开头!
 97  {  98            $mul_begin = 1 ;  99  } 100       if($mul_begin) 101  { 102          if( m#.*\*/# ) #if end width */
103  { 104             #print "Current Line:$currentLine";#addCount = 1670出问题
105             $mul_begin = 0 ; 106  } 107  } 108       else
109  { 110         #在BEGIN\n与END\n里面的就是我们需要的字符串 ##这里出要求BEGIN开头,避免字符串里面出现BEGIN
111         if( m/^\s*BEGIN/ ) 112  { 113             $begin = 1 ; 114  } 115         else
116  { 117             if( $begin ) 118  { 119                 if( /^END/ ) 120  { 121                     $begin = 0 ; 122  } 123                 else
124  { 125                     #处理数据 126  #过滤单行注释 
127                     if( !m=^\s*(//|#)= ) # if begin with // or #
128  { 129                          #处理真正的数据
130                          if( m="(.+?)"\s*,(\w+?),= ) 131  { 132                               if( !exists( $$hash_ref{$2} ) ) 133  { 134                                  $$hash_ref{$2} = $1 ; 135                                  $addCount++; 136  } 137  } 138  } 139  } 140  } 141  } 142  } 143  } 144 } 145 
146 
147 ##################### 148 #通过相同ID确定 英文与波兰文的键值关系
149 sub getDict 150 { 151    my $hash_eng = shift ; 152    my $hash_pol = shift ; 153    my $dict = shift ; 154    while(my ($key,$val) = each(%$hash_eng) ) 155  { 156         $$dict{$val} = $$hash_pol{$key}; 157  } 158 } 159 
160 ######################
161 sub main 162 { 163    my %hash_eng = () ; 164    my %hash_pol = () ; 165    my %dict = (); 166    
167    print "========READING ENG FILE============\n"; 168    readRc2File("rc2/Addition_ENU.rc2",\%hash_eng); 169    print "Hash Table Size of hash_eng:".dictSize(\%hash_eng)."\n"; 170    readRc2File("rc2/icad.rc2",\%hash_eng,1); 171    print "Hash Table Size of hash_eng:".dictSize(\%hash_eng)."\n"; 172    
173    #readRcFile("rc/IcadRes2_ENU.rc",\%hash_eng); 174  #print "Hash Table Size of hash_eng:".dictSize(\%hash_eng)."\n";
175    
176    
177    print "=======READING POL FILE============\n"; 178    readRc2File("rc2/AdditionPL.rc2",\%hash_pol); 179    print "Hash Table Size of hash_pol:".dictSize(\%hash_pol)."\n"; 180    readRc2File("rc2/icad_POL.rc2",\%hash_pol,1); 181    print "Hash Table Size of hash_pol:".dictSize(\%hash_pol)."\n"; 182    
183    #readRcFile("rc/IcadRes2_POL.rc",\%hash_pol); 184  #print "Hash Table Size of hash_pol:".dictSize(\%hash_pol)."\n";
185    
186    getDict(\%hash_eng,\%dict); 187    writeDict(\%dict,"dict/rc_dict"); 188 } 189 
190 
191 ######### 程序执行入口 ##################
192 main(); 193 
194 
195 
196 
197 ###################tools for test###########################
198 
199 sub writeDict 200 { 201     my $dict_hash = shift ; 202     my $dict_Name = shift ; 203     open my $myfd," >:utf8",$dict_Name; 204     while(my ($key,$val) = each(%$dict_hash) ) 205  { 206         if( $key ne $val ) 207  { 208            print $myfd "$key=\n$val \n" ; 209  } 210  } 211 } 212 
213 sub dictSize 214 { 215    my $hash_ref = shift ; 216    my $hash_size = keys %$hash_ref ; 217    return $hash_size; 218 } 219 sub printDict 220 { 221     my $hash_ref = shift ; 222     my $hash_size = keys %$hash_ref ; 223     print "\n---------hash_size:$hash_size-----------\n"; 224     while(my ($key,$val) = each(%$hash_ref) ) 225  { 226         print  "$key=\n$val\n" ; 227  } 228 }

由于RC文件过于复杂,还没有写出来...~>_<~+

猜你在找的Perl相关文章