免费注册 查看新帖 |

Chinaunix

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

splice 应用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-16 12:10 |只看该作者 |倒序浏览
  1. #!/urs/bin/perl
  2. use strict;
  3. use warnings;
  4. use Tie::File;                                                                  

  5. my @lines;                                               
  6. my $filename='test.txt';     
  7. my %insert=("Insert1"=>"23.22 23.456\n15.115 11.982\n","Insert3"=>"16.110 234.567\n");                                   

  8. tie(@lines,'Tie::File',$filename) or die;  

  9. my $i=-1;

  10. foreach(@lines){$i++;
  11.         if(/END/){ splice(@lines,$i,0,$insert{Insert1});
  12. }                          
  13. }

  14. untie(@lines);
复制代码
其中test.txt中的内容为
10
11
12
13
END


我想在END的前面插入Insert1的内容,但是运行的结果却是
10
11
12
13
23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982

23.22 23.456
15.115 11.982
。。。


进入死循环,是什么原因啊,还望大家帮忙,多谢~

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2011-10-16 12:22 |只看该作者
回复 1# jiujiujiu338
  1.     #!/urs/bin/perl
  2.     use strict;
  3.     use warnings;
  4.     use Tie::File;                                                                  

  5.     my @lines;                                               
  6.     my $filename='test.txt';     
  7.     my %insert=("Insert1"=>"23.22 23.456\n15.115 11.982\n","Insert3"=>"16.110 234.567\n");                                   

  8.     tie(@lines,'Tie::File',$filename) or die;  

  9.     splice(@lines,-1,0,$insert{"Insert1"});
  10.    
  11.     untie(@lines);
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-10-16 12:46 |只看该作者
回复 2# yinyuemi


    多谢,如果我的test.txt文件中是这样的:
10
11
12
13
END

34
12
23
END

56
34
55
END


在每个END前边都插入一行该怎么做呀?多谢~

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2011-10-16 13:06 |只看该作者
本帖最后由 yinyuemi 于 2011-10-16 13:12 编辑

回复 3# jiujiujiu338


    事实上,我在想你的要求,完全可以用s///完成,
如 while(<yourfile>){

s/END/$insert{"Insert1"}\n$&/

}

如果还采用splice的话,借助一个暂时的数组@temp和变量$j, 试试:

@temp=@lines;

map{$i++;splice(@line,$i-1+$j++,0,$insert{"Insert1"}) if(/END/)}@temp

论坛徽章:
0
5 [报告]
发表于 2011-10-16 15:01 |只看该作者
回复 4# yinyuemi


    采用s///是不错,但是会有空行产生,我不知道怎么去掉

论坛徽章:
0
6 [报告]
发表于 2011-10-16 19:04 |只看该作者
回复  jiujiujiu338


    事实上,我在想你的要求,完全可以用s///完成,
如 while(){

s/END/$ins ...
yinyuemi 发表于 2011-10-16 13:06



    这个map效率低下 写foreach吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP