perl 和 shell随记

1、~ /^\"(.*)\"\s+\<(\d+)-?(\d*)\>\s*$/ perl模式匹配

^\"以”开头,(.*)任意个字符,\"匹配”,\s+匹配一个以上的空白符,\<匹配一个<,(\d+)匹配一个以上的数字,-?匹配连字符-零次或一次,(\d*)匹配0或零个以上的数字,\>匹配>,\s*$/以0至0个以上的空白符结尾

 

2、一般来说,while循环中使用<>读取输入后(也包括open关键字打开文件再读取行的情况),第一行就是去除行尾的换行符,所以大多数都采用如下通用格式:

while(<>){
    chomp;
    COMMANDS;
}
 
while(){
    chomp;
    COMMANDS;
}

 

3、chomp()

读取fasta文件,内容如下:

1

2

3

4

5

6

>1

ATGCTAGCTACGTACGTACGTTTTTTTTT

>2

ACGATCGACGATCGTACGTACGTACGATT

>3

ATGCATGCTATACATCAGCTAATATCGCT

#!/usr/bin/perl 
use warnings;
use strict;

my ($fasta) = @ARGV;

open FASTA, $fasta or die "Can't open $fasta";
local $/ = ">";
while () {
    s/\n//g;
    print qq{$_\n};
}
close $fasta;
$/ = "\n";

运行这段代码,输出结果如下:

1

2

3

4

>

1ATGCTAGCTACGTACGTACGTTTTTTTTT>

2ACGATCGACGATCGTACGTACGTACGATT>

3ATGCATGCTATACATCAGCTAATATCGCT

 

可以看出,$/的值出现在每行的最后;接下来使用chomp函数

#!/usr/bin/perl 
use warnings;
use strict;

my ($fasta) = @ARGV;

open FASTA, $fasta or die "Can't open $fasta";
local $/ = ">";
while () {
    chomp;
    s/\n//g;
    print qq{$_\n};
}
close $fasta;
$/ = "\n";

输出结果为:

1

2

3

1ATGCTAGCTACGTACGTACGTTTTTTTTT

2ACGATCGACGATCGTACGTACGTACGATT

3ATGCATGCTATACATCAGCTAATATCGCT  

第一行因为是空行,这里没显示出来;可以看到每行末尾的>符号被去除了,所以chomp的真正作用是去除字符串末尾的$/,只是因为默认情况下,$/为\n,造成chomp就是去除\n的假象;

 

 

 

 

 

你可能感兴趣的:(shell,or,perl)