- 论坛徽章:
- 307
|
原帖内容如下:
总共有3个文件。
第一个文件里面每一行说明了需要的内容所在的group,区间范围,以及type(a,b,c)。
第二个文件指明了第三个文件中每个group中不同的位置的类型。
第三个文件是每个group全部的内容,“>”开头的表明是那个group,下面一行是group的全部内容。
需要:
在第三个文件中找出第一个文件每一行指定的序列。
文件内容:
------------------------- a 文件--------------------------------
group:start|stop type
3:4|17 a
5:11|19 b
------------------------- b 文件--------------------------------
group start stop type
3 1 5 a
3 6 9 b
3 11 15 c
5 1 7 a
5 8 15 b
------------------------- c 文件--------------------------------
>1
abcdefgabcdefgabcdefgabcdefgabcdefgabcdefg
>2
123456123456123456123456123456123456123456
>3
abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123
>4
a1b2c3a1b2c3a1b2c3a1b2c3a1b2c3a1b2c3a1b2c3
>5
aabbcc112233aabbcc112233aabbcc112233aabbcc112233aabbcc112233aabbcc112233aabbcc
我的代码如下:
- #!/usr/bin/perl
- use strict;
- use warnings;
- sub load_data{
- local @ARGV = shift;
- my $data = shift;
- my $merge = defined $data;
- while (<>){
- next if (/\A\D/);
- my ($group, $start, $stop, $type) = /\w+/g;
- if ($merge){
- $data->{$group}{$type}->[-1] = $stop if (exists $data->{$group}{$type});
- next;
- }
- $data->{$group}{$type} = [$start, $stop];
- }
- $data;
- }
- sub DBG{
- my $data = shift;
- foreach my $grpID (keys %$data){
- print join ("\t", $grpID, $_, @{$data->{$grpID}{$_}}), "\n" for keys %{$data->{$grpID}};
- }
- }
- my $data;
- $data = load_data ($ARGV[0], $data);
- $data = load_data ($ARGV[1], $data);
- #DBG ($data);
- my $grpID;
- while (<>){
- if (/\A>(\d)/){
- $grpID = $1;
- next;
- }
- if (exists $data->{$grpID}){
- my $line = $_;
- foreach (keys %{$data->{$grpID}}){
- my ($start, $stop) = @{$data->{$grpID}{$_}};
- $start -= 1;
- print substr ($line, $start, ($stop - $start)), "\n";
- }
- }
- }
复制代码 perl abc.pl a b c
----------------------------------------------
每次执行都显示 "Use of uninitialized value $grpID in exists at XXX",
请大家指点下, 谢谢大家了...
|
|