设为首页 收藏本站
查看: 711|回复: 0

[经验分享] Perl解析RC,RC2文件

[复制链接]

尚未签到

发表于 2015-12-26 12:02:13 | 显示全部楼层 |阅读模式
  我们正在开发的一个软件是国际化软件,所以需要翻译成其他国家的语言。但是对每一次更新实际上需要改动的语言只是一部分,其他一大部分是可重用的。
  所以,为了避免代理商再次翻译,我们从原来的版本资源文件抽出了对应的字典文件,并进行替换,达到只翻译一部分改变了的字符串。
  这其他还希望用到模糊匹配,但是效果似乎不大,不过还是很有必要的。关于模糊匹配,我看到了《编程之美》里面的一个题目:“判断字符串的相似度”。与这个类似。 以下是部分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, "<:utf8", $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,\%hash_pol,\%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文件过于复杂,还没有写出来...~>_<~+

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156529-1-1.html 上篇帖子: [Perl] Getopt 函数来接收用户参数的使用 下篇帖子: Perl简单教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表