- 论坛徽章:
- 0
|
本帖最后由 picbhan 于 2012-09-17 21:19 编辑
最近使用perl的 vec 函数储存数据,数据格式如下:
chr10 100000019 chr10 101290616
chr10 100000019 chr6 136497968
chr10 100000061 chr10 99999307
chr10 100000061 chr13 64639117
chr10 100000172 chr10 99998305
chr10 100000432 chr6 10520031
chr10 100000464 chr10 99967792
chr10 100000543 chr11 77467301
chr10 100000600 chr10 99997722
chr10 100000876 chr13 79227593
chr10 100000920 chr3 9418620
读入每行后去除掉 chr, 只储存数字, 代码如下:
my $str = '';
my $offset = 0;
open my $fin, '<', 'input.txt';
foreach ( 0 .. 9 ) { # 读取行数
my $line = <$fin>;
$line =~ s/chr//g;
my @t = split /\s/, $line;
vec( $str, $offset++, 8 ) = ( $t[0] =~ /^\d+$/ ? $t[0] : ord( $t[0] ) ); # 处理X, Y等, 示例中没有
vec( $str, $offset++, 32 ) = $t[1];
vec( $str, $offset++, 8 ) = ( $t[2] =~ /^\d+$/ ? $t[2] : ord( $t[2] ) );
vec( $str, $offset++, 32 ) = $t[3];
}
close $fin;
for ( my $i = 0 ; $i < $offset ; $i += 4 ) {
print vec( $str, $i, 8 ), "\t", vec( $str, $i + 1, 32 ), "\t",
vec( $str, $i + 2, 8 ), "\t", vec( $str, $i + 3, 32 ), "\n";
}
但是输出出现问题,前面几行数字不对, 如下:
10 183830035 10 168365432
10 183830035 6 170003248
10 183831869 10 99999307 --- 此前三行不对
10 100000061 13 64639117
10 100000172 10 99998305
10 100000432 6 10520031
10 100000464 10 99967792
10 100000543 11 77467301
10 100000600 10 99997722
10 100000876 13 79227593
而如果只读入文件第一行,则结果又是对的。
有没有人能解释下可能是什么问题呢?
另外有没有好的建议可以把第一行的数字和第二行直接连起来再储存为一个子串呢?比如使用pack和unpack(要能够在后面分开),本人对pack 和unpack看得不够透彻。 |
|