免费注册 查看新帖 |

Chinaunix

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

perl vec 函数请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-17 21:19 |只看该作者 |倒序浏览
本帖最后由 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看得不够透彻。

论坛徽章:
0
2 [报告]
发表于 2012-09-17 21:28 |只看该作者
补充一点,如果不储存第一列,只储存第二列,即去掉
    vec( $str, $offset++, 8 )  = ( $t[0] =~ /^\d+$/ ? $t[0] : ord( $t[0] ) ); # 处理X, Y等, 示例中没有
    vec( $str, $offset++, 8 )  = ( $t[2] =~ /^\d+$/ ? $t[2] : ord( $t[2] ) );
这两行后结果完全正确,但是损失了第一列和第三列的信息。因此可能是使用了不同长度的位来储存导致的问题,但是基本确定8和32应该都不会导致越界的问题。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2012-09-18 00:00 来自手机 |只看该作者
pack 就是把一个字符串的内容当malloc 出的一块内存,把perl的值按模板声明的类型转换成底层表示放入这块内存。
unpack 则是把字符串的内容当一块内存按模板声明的类型把底层表示转换成perl的值。

按上面的描述可以知道pack/unpack只能处理最基本的类型,像数组 、hash 是没法处理的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP