忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 541 | 回复: 4

perl菜鸟求助,请问这个题目应该怎么写呀,自己写了一个可是总是出错 [复制链接]

论坛徽章:
0
发表于 2017-05-06 17:47 |显示全部楼层
有一个ko_class.xls文件,现在需要把它的class展开。
文件说明:
>Metabolism ##行首为">"的为A class
@Global and overview maps ##行首为"@"的为B class
01100  Metabolic pathways ##行首为ko号的为C class
01110  Biosynthesis of secondary metabolites
01120  Microbial metabolism in diverse environments
01200  Carbon metabolism
01210  2-Oxocarboxylic acid metabolism
01212  Fatty acid metabolism
01230  Biosynthesis of amino acids
01220  Degradation of aromatic compounds
@Carbohydrate metabolism
00010  Glycolysis / Gluconeogenesis
00020  Citrate cycle (TCA cycle)
00030  Pentose phosphate pathway
00040  Pentose and glucuronate interconversions
00051  Fructose and mannose metabolism
00052  Galactose metabolism
00053  Ascorbate and aldarate metaboliusm
00500  Starch and sucrose metabolism
00520  Amino sugar and nucleotide sugar metabolism
00620  Pyruvate metabolism
文件输出格式:ko\tA class\tB class\tC class\n
如:ko Metabolism Global and overview maps 01100  Metabolic pathways
    ko Metabolism Global and overview maps 01110  Biosynthesis of secondary metabolites
...
    ko Metabolism Carbohydrate metabolism         00010  Glycolysis / Gluconeogenesis
下面是我写的

#!usr/bin/perl -w
use strict;
open(IN,"ex2");
my %result;
my $lastLnNum = 1;
while ( chomp (my $line = <IN>) ) {
        $line =~ /^(.)(.+)$/;
        $result{$1} = [] unless exists $result{$1};
        push @{$result{$1}}, $2;
        $lastLnNum++;
}
my @idx = (0..$lastLnNum);
my @symOrd = sort keys %result;
foreach my $idx ( @idx) {
        foreach my $sym ( @symOrd ) {
                print "$result{$sym}[$idx]\t";
        }       print $/;
}
结果总是说Use of uninitialized value in concatenation (.) or string at ex2.2 line 16, <IN> 。没明白
...

论坛徽章:
0
发表于 2017-05-08 17:52 |显示全部楼层
#!/usr/bin/perl

my ( $ko, @class ) = "ko\t";
while (<DATA>) {
    if (/^\d/) {
        print $ko, @class, $_;
        next;
    }
    chomp;
    my $X = /^@/;
    $class[$X] = substr( $_, 1 ) . "\t";
}

__DATA__
>Metabolism
@Global and overview maps
01100  Metabolic pathways
01110  Biosynthesis of secondary metabolites
01120  Microbial metabolism in diverse environments
01200  Carbon metabolism
01210  2-Oxocarboxylic acid metabolism
01212  Fatty acid metabolism
01230  Biosynthesis of amino acids
01220  Degradation of aromatic compounds
@Carbohydrate metabolism
00010  Glycolysis / Gluconeogenesis
00020  Citrate cycle (TCA cycle)
00030  Pentose phosphate pathway
00040  Pentose and glucuronate interconversions
00051  Fructose and mannose metabolism
00052  Galactose metabolism
00053  Ascorbate and aldarate metaboliusm
00500  Starch and sucrose metabolism
00520  Amino sugar and nucleotide sugar metabolism
00620  Pyruvate metabolism

论坛徽章:
0
发表于 2017-05-08 17:59 |显示全部楼层
回复 2# Okelani

大神,我还想问一个问题,就是如果我有一个很长的字符串,我想在输出这个字符串的时候每60个字符串为一行,而不想那个字符串占满了屏幕的整行再换行,请问怎样才能做到呀

论坛徽章:
0
发表于 2017-05-08 18:16 |显示全部楼层
回复 3# qinmin23


my $longString = join '', 'A' .. 'Z';
my $cut = 5;    # 每5个字符串为一行
$longString =~ s/(.{$cut})/$1\n/g;
say $longString;


output:

ABCDE
FGHIJ
KLMNO
PQRST
UVWXY
Z

论坛徽章:
0
发表于 2017-05-08 19:38 |显示全部楼层
回复 4# Okelani

谢谢大神,非常正确
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP