免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6473 | 回复: 22
打印 上一主题 下一主题

【结贴】perl正则表达式替换字符为空 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-03 21:38 |只看该作者 |倒序浏览
本帖最后由 xiaozi0lei 于 2013-05-17 11:37 编辑

请教一个问题:

#!/usr/bin/perl -w

open FILE,"log";
open F2,"+<log";

foreach (<FILE>{
       s@\(a\)@@;
       print F2;
}

close F2;
close FILE;


log中的内容为
(a)

输出结果为:
                        #这里是个空行,原先的(a)匹配上后被替换为空,但是为什么在下一行会多出来一个a)
a)



请教大家,帮帮忙,我想了好久都没想明白。我的目的就是把匹配到的行删除。
谢谢!
——————————————
感谢Perlvim和shuiyi193202兄弟的解释

shuiyi193202兄细致清楚的解答
首先FILE文件句柄加载了log里面的东西
然后F2用了open(文件句柄,"+<文件名",通过“+<”模式,你可以既可以读文件,又可以写文件。你可以通过tell() 函数在文件内部移动,通过seek()函数进行定位。如果文件不存在,就会被创建。如果文件已经存在,原来的数据不会被清除。
我给你一个彻底的分析:
比如说我log里面原来是ddd(a)fffg
首先第一个FIEL读入文件log,这里行串是应当是“ddd(a)fffg\n"--注意\n会被加载的,占两个字符
然后,第二个F2读入文件log,这里行串也是"ddd(a)fffg\n"--注意\n会被加载的,占两个字符
接着,FIEL里面的行被处理,去掉了(a)这个表达式,剩下在$_里面的是dddfffg\n九个字符。
然后,$_被写入到F2里面去,F2里面的原来的字符串会被从头开始重写结果是:
F2里原来的串:ddd(a)fffg\n
被替换后的串 :dddfffg\ng\n
然后写入到log文件里结果是:
dddfffg
g

论坛徽章:
1
处女座
日期:2014-03-28 10:11:00
2 [报告]
发表于 2013-05-03 22:06 |只看该作者
本帖最后由 rongchaogao 于 2013-05-03 22:34 编辑

  1. use strict;
  2. use warnings;

  3. my $ch="(a)";
  4. $ch=~s/\(a\)//;
  5. print "$ch\n";
复制代码
我只能说这个可以正常运行。

论坛徽章:
0
3 [报告]
发表于 2013-05-03 22:14 |只看该作者
兄弟,我没看明白,我照着你的code运行了一下,提示我:在替换(s///)的时候使用了未初始化的值。回复 2# rongchaogao


   

论坛徽章:
1
处女座
日期:2014-03-28 10:11:00
4 [报告]
发表于 2013-05-03 22:20 |只看该作者
本帖最后由 rongchaogao 于 2013-05-03 22:22 编辑

回复 3# xiaozi0lei


    加Q说!可能你默认开启了-w,我又修改了,你试试

论坛徽章:
0
5 [报告]
发表于 2013-05-03 22:23 |只看该作者
好的,我的QQ 43669499 谢谢回复 4# rongchaogao


   

论坛徽章:
0
6 [报告]
发表于 2013-05-03 23:06 |只看该作者
  1. #!/usr/bin/perl -w

  2. open FILE,"log";
  3. open F2,"+<log";

  4. foreach (<FILE>){
  5.   next if /\(a\)/;
  6.   print F2;
  7. }

  8. close F2;
  9. close FILE;
复制代码

论坛徽章:
0
7 [报告]
发表于 2013-05-04 10:45 |只看该作者
Hi, Perlvim 谢谢你的回复
1. 按照你写的code,我执行后无法去掉log中的(a),如果log中只有一个(a)的话,咱们的code中是直接跳过,原log中的(a)仍然存在。
如果是多行log的话:

log中的内容为
(a)
bbb
ccc

这种情况下执行后,会得到多出一行
bbb
ccc
ccc

2. 想顺便请教个问题,在读写文件时,“<和>和>>”这三种情况书上都写的很清楚,但是"+<和+>"这两种情况在执行的时候有什么区别?我现在的理解是这样的:"+<"相当于打开该文件,但不清空其中的内容。我们可以覆盖文件中的内容,不过没写到的行仍然保持原来的内容。与">"不一样的地方,就是打开文件的时候,先不执行清空的动作。

3. 另外我在小骆驼书(Learning Perl 5)中的第九章147页中看到s/,.*een//; 这里后面使用的也是替换为空。可是我自己试验的s/原字符/替换后字符/,只要替换后字符为空,s/原字符//,写入的时候,文件最后就会多出几个字符。这种情况只在写入同一文件时会发生,如果写入新的文件就不会存在这些问题。会不会是"+<"这种写操作的原因?

回复 6# Perlvim


   

论坛徽章:
0
8 [报告]
发表于 2013-05-04 10:45 |只看该作者
帮忙想想
回复 7# tkl0115


   

论坛徽章:
0
9 [报告]
发表于 2013-05-04 16:22 |只看该作者
抱歉,让你失望了,我只知道一种操作符,> , 而且每次都只会这么写

open(my $fh, '>', 'filename') or die $!;

实在搞不清楚那么多的读写符号。我在读写文件时,现在只用 File::Slurp 模块的
read_file write_file 函数接口。

在处理文件时,我很少把输出文件和输入文件设置成一个。因为一旦搞错,数据就毁了。

通常是,设置两个不同的文件,一个读,一个写,经过确认没有问题后,也不敢把原先的文件覆写。而是备份起来。

遍历文件中,对于忽略的行,通常用 next 那么在新文件中就不出现了。

论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
10 [报告]
发表于 2013-05-04 21:46 |只看该作者
Perlvim 发表于 2013-05-04 16:22
抱歉,让你失望了,我只知道一种操作符,> , 而且每次都只会这么写

open(my $fh, '>', 'filename') or d ...


顶!数据安全是最重要的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP