请问如何转换掉括号之外的字符串

请问如何转换掉括号之外的字符串

比如我有这样一个文件

[Copy to clipboard] [ - ]
CODE:
b7eba1a4c5b5d2c0c2fcd4adc0edd6d0a3acbcc6cbe3bbfad3a6b0fcc0a8(______)b5c8b9a6c4dcb2bfbcfea1a3
b0b4d5d5d6b8b7a8d2aac7f3a3acbbf7b4f2bfd5b8f1bcfca3acd3a6cab9d3c3(______)a1a3
cfd4cabec6f7b5c4c7e5cefab6c8cac7d3c9(______)bef6b6a8b5c4a1a3
d2bbb0e3c0b4cbb5a3ac(______)d6d0b5c4cafdbeddb2bbc4dcb1bbc9beb3fda1a3
d4dacea2bbfab5c4d3b2bcfecfb5cdb3d6d0a3ac(______)cac7bcc6cbe3bbfab5c4bcc7d2e4b2bfbcfea1a3
bcfcc5ccb4f2d7d6bcfcc7f8b5c4(8)b8f6bbf9d7bcbcfccebbcac7d6b8(______)a1a3
d4dacea2bbfad6d0a3ac(______)cda8b3a3d3c3c0b4b4e6b7c5(BIOS)b3ccd0f2a3acd2f2b4cbd2b2bdd0(BIOS)d0bec6aca1a3

我想把括号之外的字符串转换对应的ascii
对perl刚学,写的代码搞不定,请各位大侠指点下
注意,括号内的内容并不是一样的
我的代码如下(如果狗屁不通,请多包涵)

[Copy to clipboard] [ - ]
CODE:
#! /usr/bin/perl
my $s = "d4dacea2bbfad6d0a3ac&______,cda8b3a3d3c3c0b4b4e6b7c5&BIOS,b3ccd0f2a3acd2f2b4cbd2b2bdd0&BIOS,d0bec6aca1a3";
$s =~ /(.*?)&(.*?),(.*?)(&|,|\n|\s)/g;
$a=pack( 'H*',$1);
$b=pack( 'H*',$3);
$s =~ s/$1&(.*?),$3[&|,|\s|\n]/$a$1$b/gs;
print $s;

本来我的文件是要转换  &  与  , 之外的字符串的
考虑到便于大家看清楚我所需要转换的字符串
我贴文件上来的时候就把
& 换成 (
,  换成 )

所以我的代码是用& 与,隔开的

不知道表达的清楚不清楚

请大家帮忙,万分感谢

use strict;
use warnings;
my $str=q/
b7eba1a4c5b5d2c0c2fcd4adc0edd6d0a3acbcc6cbe3bbfad3a6b0fcc0a8(______)b5c8b9a6c4dcb2bfbcfea1a3
b0b4d5d5d6b8b7a8d2aac7f3a3acbbf7b4f2bfd5b8f1bcfca3acd3a6cab9d3c3(______)a1a3
cfd4cabec6f7b5c4c7e5cefab6c8cac7d3c9(______)bef6b6a8b5c4a1a3
d2bbb0e3c0b4cbb5a3ac(______)d6d0b5c4cafdbeddb2bbc4dcb1bbc9beb3fda1a3
d4dacea2bbfab5c4d3b2bcfecfb5cdb3d6d0a3ac(______)cac7bcc6cbe3bbfab5c4bcc7d2e4b2bfbcfea1a3
bcfcc5ccb4f2d7d6bcfcc7f8b5c4(8)b8f6bbf9d7bcbcfccebbcac7d6b8(______)a1a3
d4dacea2bbfad6d0a3ac(______)cda8b3a3d3c3c0b4b4e6b7c5(BIOS)b3ccd0f2a3acd2f2b4cbd2b2bdd0(BIOS)d0bec6aca1a3
/;
$str=~s/([[:xdigit:]]{2})/chr(oct("0x$&"))/ge;
print "-->$str<--\n";
感谢楼上的朋友
看兄弟的代码又学习了

但是
我这里有个特殊情况
那就是如果是
(CAD)cac7bcc6cbe3bbfad6d8d2aad3a6d3c3c1ecd3f2a3accbfcb5c4baacd2e5cac7(______)a1a3
cda8b3a3cbf9cbb5b5c4(CPU)d0bec6acb0fcc0a8(______)a1a3
d1a7c9fab3c9bca8b9dcc0edc8edbcfecaf4d3da(______)a1a3
(PC)b5c4baacd2e5cac7(______)a1a3
这样子的
那么会有点问题

也就是说括号当中如果也有十六进制数字的话,那么也会转换,但是我的意思是括号当中不管是什么,都不要去管它
不知道应该怎么去解决
请指点

不好意思
顶一下
恳请各位帮忙
改一下,刚才走了个弯路

[Copy to clipboard] [ - ]
CODE:
my $str=q/
b7eba1a4c5b5d2c0c2fcd4adc0edd6d0a3acbcc6cbe3bbfad3a6b0fcc0a8(__abcd__)b5c8b9a6c4dcb2bfbcfea1a3
b0b4d5d5d6b8b7a8d2aac7f3a3acbbf7b4f2bfd5b8f1bcfca3acd3a6cab9d3c3(______)a1a3
cfd4cabec6f7b5c4c7e5cefab6c8cac7d3c9(______)bef6b6a8b5c4a1a3
d2bbb0e3c0b4cbb5a3ac(______)d6d0b5c4cafdbeddb2bbc4dcb1bbc9beb3fda1a3
d4dacea2bbfab5c4d3b2bcfecfb5cdb3d6d0a3ac(______)cac7bcc6cbe3bbfab5c4bcc7d2e4b2bfbcfea1a3
bcfcc5ccb4f2d7d6bcfcc7f8b5c4(8)b8f6bbf9d7bcbcfccebbcac7d6b8(______)a1a3
d4dacea2bbfad6d0a3ac(______)cda8b3a3d3c3c0b4b4e6b7c5(BIOS)b3ccd0f2a3acd2f2b4cbd2b2bdd0(BIOS)d0bec6aca1a3
/;

my @array;
while($str =~ s/(\(.*?\))/##/){
    push @array,$1;
}
#$str =~ s/(\(.*?\))/##/g;
$str=~s/([[:xdigit:]]{2})/chr(oct("0x$&"))/ge;
my $i=0;
my $b;
$str=~s/##/$b=$array[$i];$i++;$b/ge;
print "\n",$str;

      1 #!/usr/bin/perl

      2
      3 use strict;
      4 use warnings;
      5 my $str=q/
      6 (CAD)cac7bcc6cbe3bbfad6d8d2aad3a6d3c3c1ecd3f2a3accbfcb5c4baacd2e5cac7(______)a1a3
      7 cda8b3a3cbf9cbb5b5c4(CPU)d0bec6acb0fcc0a8(______)a1a3
      8 d1a7c9fab3c9bca8b9dcc0edc8edbcfecaf4d3da(______)a1a3
      9 (PC)b5c4baacd2e5cac7(______)a1a3
     10 /;
     11
     12 print &handle ($str) ;
     13
     14
     15 sub handle {
     16    my $tmp = shift @_ ;
     17    if ($tmp =~ /([^\(]*)(\(.*?\))(.*)/s) {
     18      &handle ($1) . $2 . &handle ($3) ;
     19    } else {
     20      $tmp =~ s/([[:xdigit:]]{2})/chr(oct("0x$1"))/ge ;
     21      $tmp ;
     22    }
     23 }


运行: ./to_ascii.pl

(CAD)是计算机重要应用领域,它的含义是(______)。
通常所说的(CPU)芯片包括(______)。
学生成绩管理软件属于(______)。
(PC)的含义是(______


QUOTE:
原帖由 __lxmxn__ 于 2007-12-12 16:49 发表
use strict;
use warnings;
my $str=q/
b7eba1a4c5b5d2c0c2fcd4adc0edd6d0a3acbcc6cbe3bbfad3a6b0fcc0a8(______)b5c8b9a6c4dcb2bfbcfea1a3
b0b4d5d5d6b8b7a8d2aac7f3a3acbbf7b4f2bfd5b8f1bcfca3acd3a6cab9 ...

外面再套一层, 选出()外面的东西先:
for ($str =~ /([^()]+)(?=\(|$)/g) {
    ... ...
}


QUOTE:
原帖由 老手 于 2007-12-12 23:47 发表
      1 #!/usr/bin/perl

      2
      3 use strict;
      4 use warnings;
     ...

学习了,大虾能否解析下?看不懂
非常感谢楼上各位兄台
学习了


QUOTE:
原帖由 liang573728 于 2007-12-13 09:20 发表



学习了,大虾能否解析下?看不懂

设计思路是:

根据所处理字符串的特点, 将其分解成 "括号前" "某个括号住的内容" "括号后"三部分; 分别处理前后两部分,再与不处理的括号部分拼接而成.

这里说的"括号前""括号后" 是针对某一个括号而言的 , 这两个部分本身还可能包含其他括号 . 那么继续层层划分直到剩下的部分不再有括号.

这种特点最容易用"递归"实现. 上面代码中 handle 就是一个递归函数.

     17    if ($tmp =~ /([^\(]*)(\(.*?\))(.*)/s) {
     18      &handle ($1) . $2 . &handle ($3) ;

就把要处理的串分解成: 括号前$1 部分 , 括号及括住内容部分$2 , 括号后$2部分.
前后两部分要处理 , 所以用了handle . 18 行把处理完的部分和原来的$2部分拼接完后返回.

17,18 完成拆解和再拼接,真正的转化是在被分解的部分不再含有"括号"后进行的:

     19    } else {
     20      $tmp =~s/([[digit:]]{2})/chr(oct("0x$1")/ge ;
     21      $tmp ;
     22    }

针对串:

(CAD)是计算机重要应用领域,它的含义是(______)。
通常所说的(CPU)芯片包括(______)。
学生成绩管理软件属于(______)。
(PC)的含义是(______)。

第一层调用handle , 将以"(CAD)"为界将整串拆成:
1.1  " "
1.2  "(CAD)"
1.3  "是计算机重要应用领域,它的含义是(______)。
     通常所说的(CPU)芯片包括(______)。
     学生成绩管理软件属于(______)。
     (PC)的含义是(______)。"
3个部分. 对1和3再调用handle分别处理.


对上面1的 " "串 , 由于已经没了括号 , 所以再次handle处理时,将执行:
     19    } else {
     20      $tmp =~s/([[digit:]]{2})/chr(oct("0x$1")/ge ;
     21      $tmp ;
     22    }

对上面3的 "是计算机重要应用领域,它的含义是(______)。
     通常所说的(CPU)芯片包括(______)。
     学生成绩管理软件属于(______)。
     (PC)的含义是(______)。"
其实形式和没有分解前没什么两样 , 再次使用handle分解成:
2.1  "是计算机重要应用领域,它的含义是"
2.2  "(______)"
2.3  "。
     通常所说的(CPU)芯片包括(______)。
     学生成绩管理软件属于(______)。
     (PC)的含义是(______)。"

2.1直接处理,2.3再用handle.

如此下去,最终会被分解到最后一个"。" 至此分解和处理过程结束,接下来就是层层拼接返回的过程.


这样解释不知道有没有道清楚. 我是以其他语言的思路来写的 , 我是perl新手 . perl语法方面的,还是请"flw""Lonki"等perl大牛们来释疑.