搜索
查看: 2379|回复: 2

【月亮-Perl练习题2】使用Perl定长切割字符串

[复制链接]

8

主题

55

帖子

336

积分

版主

Rank: 7Rank: 7Rank: 7

积分
336
发表于 2016-9-26 11:17:08 | 显示全部楼层 |阅读模式
本帖最后由 dulunar 于 2016-9-26 11:20 编辑

Perl定长切割字符串、切割的返回数组(最常见的子函数代替):
[Perl] 纯文本查看 复制代码
sub splitStr {
my ( $strtmp, $length ) = @_;
my $strLength = length $strtmp;
my @results;
for ( my $i = 0 ; $i < $strLength ; $i += $length ) {
#if length reach the bound , just resturn the left ones 
if ( $strLength < ( $i + $length ) ) {
push @results, substr( $strtmp, $i );
}
else {
push @results, substr( $strtmp, $i, $length );
}
}
return \@results;
}


还有个方法是使用unpack函数
用 pack将零散的数据组合成一个固定长度的字符床,用unpack将固定长度的字符串按模板分为不同的字符串。
[Perl] 纯文本查看 复制代码
$a = "AATATATTGGCGCGTTAGCGGAGCGANNAGGATTCGAGCTGACAN";
@a = unpack("A3"x10,$a); ## 把$a分成10个有3个字符的字符串;


再有一个就是正则表达式:
[Perl] 纯文本查看 复制代码
@a = $a =~ /(.{3})/g;   ##把$a按照3个字符的定长切割





上一篇:GCMS代谢组学在疾病研究方面的应用
下一篇:pysam - 多种数据格式读写与处理模块(python)
我的微博:dulunar
回复

使用道具 举报

8

主题

55

帖子

336

积分

版主

Rank: 7Rank: 7Rank: 7

积分
336
 楼主| 发表于 2016-9-26 11:33:23 | 显示全部楼层
进阶:Perl从中英混合字符串中截取固定字节|固定字符长度子串

[Perl] 纯文本查看 复制代码
#---------------------------------------------
# [于英文,数字,特殊符号,汉字组合串中]
# 在保证截取后中文完整,不出现乱码或问号情况下:
# 截取尽可能接近$len个字节长度的字符串
#---------------------------------------------
sub truncate_str {
    my ($str, $len) = @_;
    my ($result, $parity);

my @str = split //,$str;
    if (length($str) > $len) {
        for (my $i = 0; $i < $len; $i++) { # 在要求长度内
##my $c = substr($str, $i, 1); ##为英文
my $c = $str[$i];
            if (ord($c) < 127) {   ##ord返回指定的字符的ASCII数值
                $parity += 1;
            }    
        }    
        $result = substr($str, 0, int(($len - $parity)/3) * 3 + $parity);
    } 

else {$result = $str;} 
}

#-----------------------------------------
# use utf8后无论英文汉字都当成一个字符处理
# 需要use Encode;
#-----------------------------------------
sub truncateStr {
    my ($str, $len) = @_;

    return encode('utf8', substr(decode('utf8',$str), 0, $len));    
}


代码来自于http://blog.sina.com.cn/s/blog_71261a2d01014x74.html
我没有验证,但是解读完代码,我觉着这个是对的~
我的微博:dulunar
回复 支持 反对

使用道具 举报

4

主题

29

帖子

119

积分

注册会员

Rank: 2

积分
119
发表于 2016-9-26 20:44:27 | 显示全部楼层
厉害,学习了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树    

GMT+8, 2019-6-18 09:39 , Processed in 0.043281 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.