作者jjt (jet)
看板Perl
标题Re: [请益] 一段string matching的意思
时间Thu Jan 3 12:13:17 2008
: : while ( $theText =~ m/([=\%\&]([A-Za-z0-9]{2}))/g )
: : {
: : my $to = hex($2);
: : $to = chr($to);
: : if($2 ne "01")
: : {
: : $theText =~ s/[=\%]$2/$to/g;
: : }
: : }
: : --------------------------------
: → JeffMcBride:谢谢大大的范例:D perl越来越有趣 01/02 20:03
: 推 JeffMcBride:不过您埋下的伏笔.."这个程式写的不好" 是为什麽呢.. 01/02 20:28
: 推 abliou:推楼上的!!我也想知道理由...XD 01/02 21:32
这样写虽然是对的 可是我看不习惯XD
m//g的用法
http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators
简单说有两种
1. 把match到的字串放到一个array
$line = 'ptt 2007 01';
@data = $line=~/(\w+)/g;
#$data[0]='ptt' $data[1]='2007' $data[2]='01'
2. 计算match到的字串出现的次数
$line = 'ptt 2007 01';
while($line=~/(\w)/g)
{
$count++;
}
#$count=9
原po的写法很厉害,我去看了m//g的说明才知道可以这样用
因为只要把g拿掉 这个程式就有机会无限回圈了
并且while里面的 m//g 最外面的大括弧是多余的 没必要用到$2
把前一个括弧拿掉 後面改成$1
还有%& 前面不需要加上 \
& 後面没用到所以最一开始就不用去搜寻他
我的话会这样写,会比较慢 但是没有if while
$theText=~s/01/&01/g;
$theText =~ s
/[=%]
(\w{2}
)/chr(hex($1))
/eg;
$theText=~s/&01/01/g;
这样写的好处就不多了,原po的方法修正一下
把一些match用不到的地方去掉,就不错了
(看来我越来越呆了)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.121.197.133
1F:推 david220:你这样会把%01也换成=01? 01/03 22:47
没注意到 抱歉 >_< 修正
※ 编辑: jjt 来自: 140.121.197.133 (01/04 06:33)
2F:推 david220:你好像误会我意思了 XD 01/05 14:12