perl入门06:常用字符串处理函数

1、 index

  • 返回子字符串在字符串中最先出现的位置;
  • 注意从0开始计算,可以理解为前面有多少字符;
  • 找不到则返回-1;
  • rindex则确定搜索子字符串在字符串中最后出现的位置。
#!/usr/bin/perl -w
use strict;
my $seq="TGAAACTCTACAATCTGAAAGATGCACAACGAGCAGGTAAGCTATGCGCAAGCCGTAACCCAGGGGTTAA";
my $where=index ($seq,"ATG");  #要加小括号
my $where=index ($seq,"ATG",23);  #从字符串第24个碱基开始搜索
my $where=index ($seq,"ATG",index ($seq,"ATG")+1);
#寻找第二次出现ATG的位置
my $where=rindex ($seq,"ATG");   #最后出现的位置
print "$where\n";

2、 substr

  • 截取特定长度子字符串
#!/usr/bin/perl -w
use strict;
my $seq="TGAAACTCTACAATCTGAAAGATGCACAACGAGCAGGTAAGCTATGCGCAAGCCGTAACCCAGGGGTTAA";
my $atg=index($seq,"ATG");
my $taa=rindex($seq,"TAA");
my $len=$taa-$atg;
my $output=substr($seq,$atg,$len);
#参数依次为原字符串、起始位置,截取长度
print "$output\n"
  • substr也有替换功能
my $string="Hello,world!"
substr ($strict,0,5)="Goodbye";
#将原字符串的前5个字符替换为Goodbye

3、 排序

3.1、按照数值大小排序
  • sort的数字排序默认按照码值,但实际情况下,我们更希望是按照值大小;
  • 加入飞碟操作符,即可
    sort (a<=>b) <>; #按照值,从小到大排序;
    sort (b<=>a) <>; #按照值,从大到小排序;
#!/usr/bin/perl -w
use strict;

my @array=(1..20);

my @sort=sort @array;
my @sort_by_number1=sort {$a<=>$b} @array;
my @sort_by_number2=sort {$b<=>$a} @array;
#my @sort_by_number2=reverse sort {$a<=>$b} @array;

print "@sort\n"; 
print "@sort_by_number1\n";
print "@sort_by_number2\n";
数字排序
3.2、字母排序
  • sort 默认字母排序:先大写后小写,再按字母表排序
  • cmp 排序与sort抑制,但可修饰不区分大小写
#!/usr/bin/perl -w
use strict;

my @array=qw /A  D k z E G F  a k B c k z/;

my @sort=sort @array;
my @sort_by_number1=sort {$a cmp $b} @array;
my @sort_by_number2=sort {"\L$a" cmp "\L$b"} @array;
# 不区分大小写的字母表排序

print "@sort\n";
print "@sort_by_number1\n";
print "@sort_by_number2\n";
字母排序
3.3、哈希数据结构排序
  • 前面说的都是对数组的排序。其实对哈希排序本质上也是对数组排序,键数组或者值数组。
  • 这里以对成绩表(姓名--成绩)排序为例
#!/usr/bin/perl -w
use strict;

#一份成绩单哈希结构
my %score=(
        "barney"=>95,
        "fred"=>92,
        "dino"=>67,
        "bamm"=>81,
        "tom"=>95,
        "kate"=>88,
        "bill"=>99,
    );

#按名字(键)首字母排序
foreach (sort {$a cmp $b} keys %score) {
    print "$_ => $score{$_}\n";
}
print "\n";
#根据分数(值)大小排序
foreach (sort {$score{$b} <=> $score{$a} } keys %score) {
#foreach (sort {$score{$b} <=> $score{$a} or  $a cmp $b} keys %score) {
# or 语句表示相同成绩按姓名首字母排序
    print "$_ => $score{$_}\n";
}
哈希排序

4、 其它一些字符处理函数

  • length ($seq); 计算字符串长度
  • chomp ($seq); 去掉换行符
  • chop ($seq); 去掉最后一个字符
  • reverse ($seq); 字符串反转
  • lc ($seq); #将字符串变成小写
  • uc ($seq); #将字符串变成大

5、 生信综合练习例子

  • 目的:核苷酸序列→氨基酸序列
  • 思路:将氨基酸序列分成3个一组,与密码子表(哈希结构)匹配,输出。
#!/usr/bin/perl 
use strict;

if (scalar @ARGV==0) {
        die "This program is used to trans cds to pep
             perl $0 <cds file>  <pep file> \n";
}

open IN,"$ARGV[0]";  #输入fasta核苷酸序列

open OU,">$ARGV[1]";  #输出氨基酸序列
$/=">";<IN>;
while (<IN>) {
    chomp;
    next if (/^\s+$/);  #去除空白行
    my ($id,$dna)=(split /\n/,$_,2)[0,1];
    #分开ID与序列,并将序列都在一行内
    $dna=~ s/\n//g;
    my $protein="";  #用来存储翻译好的氨基酸序列
    for(my $i=0; $i < (length($dna) - 2) ; $i += 3) {
        $protein .= &codon2aa( substr($dna,$i,3) );
    #利用substr每次读取三个核苷酸,赋给子函数
    #利用子函数将转换为氨基酸
    }
     print OU ">$id\n";
     print OU "$protein\n";
}
#编写子函数
$/="\n";
sub codon2aa {
    my($codon) = @_;

    $codon = uc $codon;  #转换成大写

    my(%genetic_code) = (

            'TCA' => 'S',    # Serine
            'TCC' => 'S',    # Serine
            'TCG' => 'S',    # Serine
            'TCT' => 'S',    # Serine
            'TTC' => 'F',    # Phenylalanine
            'TTT' => 'F',    # Phenylalanine
            'TTA' => 'L',    # Leucine
            'TTG' => 'L',    # Leucine
            'TAC' => 'Y',    # Tyrosine
            'TAT' => 'Y',    # Tyrosine
            'TAA' => '',    # Stop
            'TAG' => '',    # Stop
            'TGC' => 'C',    # Cysteine
            'TGT' => 'C',    # Cysteine
            'TGA' => '',    # Stop
            'TGG' => 'W',    # Tryptophan
            'CTA' => 'L',    # Leucine
            'CTC' => 'L',    # Leucine
            'CTG' => 'L',    # Leucine
            'CTT' => 'L',    # Leucine
            'CCA' => 'P',    # Proline
            'CCC' => 'P',    # Proline
            'CCG' => 'P',    # Proline
            'CCT' => 'P',    # Proline
            'CAC' => 'H',    # Histidine
            'CAT' => 'H',    # Histidine
            'CAA' => 'Q',    # Glutamine
            'CAG' => 'Q',    # Glutamine
            'CGA' => 'R',    # Arginine
            'CGC' => 'R',    # Arginine
            'CGG' => 'R',    # Arginine
            'CGT' => 'R',    # Arginine
            'ATA' => 'I',    # Isoleucine
            'ATC' => 'I',    # Isoleucine
            'ATT' => 'I',    # Isoleucine
            'ATG' => 'M',    # Methionine
            'ACA' => 'T',    # Threonine
            'ACC' => 'T',    # Threonine
            'ACG' => 'T',    # Threonine
            'ACT' => 'T',    # Threonine
            'AAC' => 'N',    # Asparagine
            'AAT' => 'N',    # Asparagine
            'AAA' => 'K',    # Lysine
            'AAG' => 'K',    # Lysine
            'AGC' => 'S',    # Serine
            'AGT' => 'S',    # Serine
            'AGA' => 'R',    # Arginine
            'AGG' => 'R',    # Arginine
            'GTA' => 'V',    # Valine
            'GTC' => 'V',    # Valine
            'GTG' => 'V',    # Valine
            'GTT' => 'V',    # Valine
            'GCA' => 'A',    # Alanine
            'GCC' => 'A',    # Alanine
            'GCG' => 'A',    # Alanine
            'GCT' => 'A',    # Alanine
            'GAC' => 'D',    # Aspartic Acid
            'GAT' => 'D',    # Aspartic Acid
            'GAA' => 'E',    # Glutamic Acid
            'GAG' => 'E',    # Glutamic Acid
            'GGA' => 'G',    # Glycine
            'GGC' => 'G',    # Glycine
            'GGG' => 'G',    # Glycine
            'GGT' => 'G',    # Glycine
            );

    if(exists $genetic_code{$codon}) {
        return $genetic_code{$codon};
    }else{
        return "X";   #未匹配到的情况

    }
}
perl 1.pl gene.ffn gene.pep
head gene.pep
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,517评论 6 539
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,087评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,521评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,493评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,207评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,603评论 1 325
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,624评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,813评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,364评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,110评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,305评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,874评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,532评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,953评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,209评论 1 291
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,033评论 3 396
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,268评论 2 375

推荐阅读更多精彩内容