数组哈希以创建唯一 ID
hash of arrays to create unique ids
我想为包含基因转录本的文件创建唯一 ID。每行由 transcript_id 和内含子组成,格式为:chromosome:start_coord-end_coord:strand。
我的文件如下所示:
CUFF.59321 chr7:134136506-134143748:-
CUFF.59321 chr7:134135655-134136337:-
CUFF.59321 chr7:134134550-134135537:-
CUFF.59321 chr7:134133872-134134471:-
CUFF.59321 chr7:134133246-134133748:-
CUFF.59321 chr7:134132814-134133138:-
CUFF.57276 chr7:25163747-25164818:-
CUFF.57276 chr7:25163469-25163569:-
我想合并重复的 transcript_ids(第 1 列)和它们的起点和终点坐标。
CUFF.57276 示例:
CUFF.57276 chr7:25163747-25164818:25163469-25163569:-
为此,我使用了数组哈希。
#!/usr/bin/perl -w
use strict;
my $input_gtf = shift @ARGV or die $!;
my %hash;
open (FILE, "$input_gtf") or die $!;
while (<FILE>) {
my $line = $_;
chomp $line;
my @array = split /:\s+/, $line;
my $cuff = $array[0];
my @introns = $array[1];
$hash{$cuff} = [@introns];
}
foreach my $cuff(keys %hash) {
print "$cuff:${hash{$cuff}}\n";
}
close FILE;
但是我得到了以下输出:
CUFF.61092 chr8:67968840-67969614:-:ARRAY(0x16a8b10)
CUFF.30258 chr19:16636489-16638890:-:ARRAY(0x15f3b00)
CUFF.47340 chr4:85719262-85722802:-:ARRAY(0x2ae38599de90)
我如何可视化 ARRAY(0x16a8b10) 语句或类似语句的值?
输入中 :
后没有空格,因此 $array[1]
为空。此外,您不想为每一行覆盖 $hash{$cuff}
,您希望将新范围 push 放入现有数组中。 @{ ... }
是 数组解引用,它把一个数组引用变成它引用的数组。
这是我的脚本版本:
#!/usr/bin/perl
use warnings;
use strict;
my $input_gtf = shift or die $!;
my %hash;
open my $FILE, $input_gtf or die $!;
while (my $line = <$FILE>) {
chomp $line;
my @array = split /:/, $line;
my ($cuff, $introns) = @array;
push @{ $hash{$cuff} }, $introns;
}
close $FILE;
for my $cuff (keys %hash) {
print join ':', $cuff, @{ $hash{$cuff} };
print "\n";
}
我对代码所做的无关更改:
- 词法文件句柄的使用。它们更安全,更容易传递。
- 不需要使用
$_
只是将其存储在不同的变量中。您可以直接将 <>
赋值给一个变量。
我想为包含基因转录本的文件创建唯一 ID。每行由 transcript_id 和内含子组成,格式为:chromosome:start_coord-end_coord:strand。 我的文件如下所示:
CUFF.59321 chr7:134136506-134143748:-
CUFF.59321 chr7:134135655-134136337:-
CUFF.59321 chr7:134134550-134135537:-
CUFF.59321 chr7:134133872-134134471:-
CUFF.59321 chr7:134133246-134133748:-
CUFF.59321 chr7:134132814-134133138:-
CUFF.57276 chr7:25163747-25164818:-
CUFF.57276 chr7:25163469-25163569:-
我想合并重复的 transcript_ids(第 1 列)和它们的起点和终点坐标。 CUFF.57276 示例:
CUFF.57276 chr7:25163747-25164818:25163469-25163569:-
为此,我使用了数组哈希。
#!/usr/bin/perl -w
use strict;
my $input_gtf = shift @ARGV or die $!;
my %hash;
open (FILE, "$input_gtf") or die $!;
while (<FILE>) {
my $line = $_;
chomp $line;
my @array = split /:\s+/, $line;
my $cuff = $array[0];
my @introns = $array[1];
$hash{$cuff} = [@introns];
}
foreach my $cuff(keys %hash) {
print "$cuff:${hash{$cuff}}\n";
}
close FILE;
但是我得到了以下输出:
CUFF.61092 chr8:67968840-67969614:-:ARRAY(0x16a8b10)
CUFF.30258 chr19:16636489-16638890:-:ARRAY(0x15f3b00)
CUFF.47340 chr4:85719262-85722802:-:ARRAY(0x2ae38599de90)
我如何可视化 ARRAY(0x16a8b10) 语句或类似语句的值?
输入中 :
后没有空格,因此 $array[1]
为空。此外,您不想为每一行覆盖 $hash{$cuff}
,您希望将新范围 push 放入现有数组中。 @{ ... }
是 数组解引用,它把一个数组引用变成它引用的数组。
这是我的脚本版本:
#!/usr/bin/perl
use warnings;
use strict;
my $input_gtf = shift or die $!;
my %hash;
open my $FILE, $input_gtf or die $!;
while (my $line = <$FILE>) {
chomp $line;
my @array = split /:/, $line;
my ($cuff, $introns) = @array;
push @{ $hash{$cuff} }, $introns;
}
close $FILE;
for my $cuff (keys %hash) {
print join ':', $cuff, @{ $hash{$cuff} };
print "\n";
}
我对代码所做的无关更改:
- 词法文件句柄的使用。它们更安全,更容易传递。
- 不需要使用
$_
只是将其存储在不同的变量中。您可以直接将<>
赋值给一个变量。