LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1994|回复: 6

perl入门教程的一个习题疑惑!

[复制链接]
发表于 2009-12-29 18:22:03 | 显示全部楼层 |阅读模式
题目为将文件中的fred变成larry ,文件中的larry变种fred 也就是 fredandlarry将变成 larryandfred。
答案给定为:
   $^I=‘.out’;
     while(<>){
        unless(s/fred/larry/gi){
                    s/larry/fred/gi;
                   }   

我的疑问是当文件中的一行存在fredandlarry,那么s/fred/larry/gi将返回正确,则不会执行s/larry/fred/gi。是不是最终fredandlarry将变成larryandlarry呢?
发表于 2009-12-29 22:06:52 | 显示全部楼层
看不懂。。。。。
回复 支持 反对

使用道具 举报

发表于 2009-12-31 12:20:36 | 显示全部楼层
我的疑问是当文件中的一行存在fredandlarry,那么s/fred/larry/gi将返回正确,则不会执行s/larry/fred/gi。是不是最终fredandlarry将变成larryandlarry呢?
============
是的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-1-4 16:19:16 | 显示全部楼层
请问大侠 怎么才能达到让他们互换的效果呢。
回复 支持 反对

使用道具 举报

发表于 2010-1-5 00:14:03 | 显示全部楼层
fred变\fred
larry变fred
\fred变larry
回复 支持 反对

使用道具 举报

发表于 2010-3-10 23:44:11 | 显示全部楼层
这里不能直接用正则式替换。

你的意思是让larry和fred互换。所以我们可以这么干:

$line;#假设这是你的行变量。
my @par = split /larry/,$line;
foreach (@par){
     $_ =~ s/fred/larry/gi;
}
$line = join /fred/,@par;

先用larry作为标准把你获得的行拆开,再逐个替换其中的fred为larry,然后再用fred作胶水把替换过后的数组粘到一起,这样就可以了。(代码未经验证,并不代表可以上机执行)
回复 支持 反对

使用道具 举报

发表于 2010-3-21 22:52:20 | 显示全部楼层
perl -p -e "s/fred/=##=/g; s/larry/fred/g; s/=##=/larry/g"

开始前先看看里面有没有"=##="
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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