免费注册 查看新帖 |

Chinaunix

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

perl程序改进 [复制链接]

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2016-07-03 00:10:20
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-25 04:52 |只看该作者 |倒序浏览
#!/usr/bin/perl
open FILE,"p";
while(<FILE>){
        chomp;
        $hash{$_} +=1;
}
while($gene = <>){
        foreach $key (keys (%hash)){
                if ($gene =~ /^NC_.+$key/s){
                        print $key."\t".$gene;
                        delete $hash{$key};
                }
        }
}
~
这是我写的一个用于在其他文件如1.txt中匹配多行开头一样,只输出相同行第一行的perl程序
如文件p为
NC_001
NC_002
NC_003
文件1.txt为
NC_001 123 234
NC_001 134 235
NC_001 112 321
NC_001 102 223
.
.
.
NC_002 234 256
NC_002 432 523
NC_002 342 543
.
.
.
NC_003 345 432
NC_003 342 532
.
.
.
结果输出来是
NC_001 123 234
NC_002 234 256
NC_003 345 432

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
2 [报告]
发表于 2016-06-25 05:30 |只看该作者
$>  cat test.pl
@Files = @ARGV;  #Keep the file names
push @{$A->{$ARGV}}, $_ while (<>);   #read the files
print map {   
  my $K = s/\n//r;
  ($_) = grep /$K/, @{$A->{$Files[1]}};  #get the first line from the second file matches the keys in the first file
} @{$A->{$Files[0]}};

$>  perl test.pl p 1.txt
NC_001 123 234
NC_002 234 256
NC_003 345 432

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2016-07-03 00:10:20
3 [报告]
发表于 2016-06-25 05:53 |只看该作者
回复 2# RE_HASH
大神报错了:
syntax error at test.pl line 2, near "$_while("
Execution of test.pl aborted due to compilation errors.
这是为啥?
   

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
4 [报告]
发表于 2016-06-25 06:16 |只看该作者
my perl version :
$>  perl -v

This is perl 5, version 22, subversion 0 (v5.22.0) built for x86_64-linux


what is yours?

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
5 [报告]
发表于 2016-06-25 06:17 |只看该作者
try this:

@Files = @ARGV;
while (<>) {
  push @{$A->{$ARGV}}, $_ ;
}

print map {
  my $K = s/\n//r;
  ($_) = grep /$K/, @{$A->{$Files[1]}};
} @{$A->{$Files[0]}};

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
6 [报告]
发表于 2016-06-25 06:18 |只看该作者
是不是少了空格?

$_        while (<>)

论坛徽章:
1
15-16赛季CBA联赛之佛山
日期:2016-07-03 00:10:20
7 [报告]
发表于 2016-06-25 06:21 |只看该作者
回复 2# RE_HASH
哦哦,我的错$_与while之间要有空格,非常感谢大神的帮助。

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP