免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Perl tr///
最近访问板块 发新帖
查看: 3917 | 回复: 6
打印 上一主题 下一主题

tr/// [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-20 13:57 |只看该作者 |倒序浏览

$dna1="2220122201022001110111122";


foreach (0..0){
  $D[$_]= substr($dna1,30*$_,30);
  $E[$_]=($D[$_]=~ tr/1/1/);
  $C[$_]=($D[$_]=~ tr/01/01/s);
  $B[$_]=($D[$_]=~ tr/1/1/);
  print $E[$_];
  print "\n";
  print $C[$_];
  print "\n";
  print $B[$_];
  
}
输出结果是
9
15
4


我希望计算01出现的个数,连续的01。而非0或1。可是如果我写成这样,最后print $B是我想要的结果,可是我明明写的是B是tr/1/1/啊。C我写成 tr/01/01/s反而得不到我要的结果反而输出的是0或者1的个数。。。希望大家给我解释一下我如何在这段字符串中匹配计算出01的个数也就是4

论坛徽章:
0
2 [报告]
发表于 2014-08-20 14:40 |只看该作者
$dna1="100010000100000111111111111111111110111100";
$W=($dna1=~ tr/01/01/s);
print $dna1;
print "\n";


结果是1010101010

他是将原字符串100010000100000111111111111111111110111100中连续的0变成单个0,连续的1变成单个1,为何会有这种效果呢,如何解读,谢谢

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
3 [报告]
发表于 2014-08-20 14:42 |只看该作者
回复 1# papagogogo


try:
  1. perl -e '$_="2220122201022001110111122";print s/01/01/g;'
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00
4 [报告]
发表于 2014-08-21 06:57 |只看该作者
回复 3# ly5066113


    似乎没有那么简单...
    Bioinfo 还有效率问题,tr/// 返回计数该是比s///快很多的...
    看楼主数据量有多大,能不能忍吧...

    我试想可以把多行merge到一行,然后 index 和reindex..
    不过没有benchmark,不知效率...

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2014-08-21 09:25 |只看该作者
回复 1# papagogogo

$ perl -e '$_="2220122201022001110111122";$c++ while(m/01/g);print "$c\n"'
4

$ perl -e '$_="2220122201022001110111122";$c++ while(m/0/g);print "$c\n"'
6

$ perl -e '$_="2220122201022001110111122";$c++ while(m/1/g);print "$c\n"'
9

   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00
6 [报告]
发表于 2014-08-22 23:18 |只看该作者
回复 5# jason680


    赞!学习了!

cat tr_test.pl

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my $data="01" x 10000000;
  5. my $one=$data=~tr/01/01/;
  6. print "$one\n";
复制代码
cat s_test.pl

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my $data="01" x 10000000;
  5. my $one=$data=~s/(01)/(01)/g;
  6. print "$one\n";
复制代码
cat m_test.pl

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my $data="01" x 10000000;
  5. my $one=0;
  6. while($data=~m/01/g){
  7.         $one++;
  8. }

  9. print "$one\n";
复制代码
结果:
  1. time perl tr_test.pl
  2. 20000000

  3. real        0m0.061s
  4. user        0m0.032s
  5. sys        0m0.026s



  6. time perl s_test.pl
  7. 10000000

  8. real        0m3.279s
  9. user        0m3.192s
  10. sys        0m0.072s



  11. time perl m_test.pl
  12. 10000000

  13. real        0m1.233s
  14. user        0m1.189s
  15. sys        0m0.027s
复制代码

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
7 [报告]
发表于 2014-08-24 11:36 |只看该作者
tr/012/012/
tr/0/0/ + tr/1/1/ + tr/2/2/
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP