BGI-College生信入门——6、Perl小骆驼学习笔记(一
「环境」
-w显示程序中出现的一些警告,方便debug
#!/usr/bin/perl -w
「基础语法」
perl -e'print "hello world!\n"'
hello world!
「创建perl脚本」
vi hello_world.pl
# 进入输入模式键入以下内容,并保存退出
#!/usr/bin/perl -w
print"hello world!\n";
print'hello world!\n';
# 保存退出
:wq
「运行hello_world.pl」
perl hello_world.pl
「运行结果」
hello world!
hello world!\n
双引号和单引号的区别:双引号可以正常解析转义符(\),单引号无法解析则会原样输出
「标识符」
程序中使用的变量名、常量名、函数名和语句块名等统称为标识符
英文字母(a~z,A~Z),数字(0~9)和下划线(_)
区分大小写
「数据类型」
「标量:数字和字符串(使用时在变量前加$表示标量)」
1.单引号内的字符串直接量(单引号内表示单引号或反斜杠需要用反斜杠转义)
my$s1= cool;
my$s2="today is$s1";
my$s3='today is $s1';
print$s2$3;
#运行结果:today is cool today is $s1
2.字符串操作符:“.”表示连接,“x”表示重复
my$a= bio;
my$b= informatics;
my$c=$a.$b
my$d=$ax 3;
print$c$d;
#运行结果:bioinformatics biobiobio
3.双目赋值操作符:“+=”、“*=”和“.=”
my$j+= 1;
#等效于my $j = $j + 1;
my$k*= 2;
#等效于my $k = $k * 2
my$l.= 3;
#等效于my $l = $l . 3
「数组:用于存储一个有序的标量值的变量」
1.数组 @ 开始,使用美元符号($)+变量名来访问数组的变量(指定下标)
@number = (1,2,3,4,5);
print$number[0];
#运行结果:1
#也可以用qw简写来定义数组
@data = qw/1 2 3 4 5/;
@data = qw!1 2 3 4 5!;
@data = qw#1 2 3 4 5#;
@data = qw[1 2 3 4 5];
@data = qw{1 2 3 4 5};
2.按序列输出的数组形式:起始值..结束值
@data = (1..10);
print"@data\n";
#运行结果:
1 2 3 4 5 6 7 8 9 10
「添加或删除数组元素」
1.pop
#删除数组最后一个元素
pop @array;
2.shift
#弹出数组第一个值,并返回它。数组的索引值也依次减一。
shift@array;
3.push
#将List(列表)中的值添加到数组末尾
push @array, List;
4.unshift
#将List(列表)中的值添加到数组开头,并返回新数组的元素个数
unshift @array, List;
「访问数组元素」
1.任何求值得到数字的表达式都可用作下标,如果得到非整数会自动舍去小数,无论正负
2.下标超过数组尾端则返回undef
「切割数组:」
@data = (1..10);
@copy = @data[3,4,5];
print@copy;
「列表的赋值:」
左侧列表的三个变量被依次赋予右侧列表对应的值,等效于三次独立的赋值操作
($a,$b,$c) = ("earth","moon", undef);
左右两侧数量不对等时:
左侧(变量)>右侧(标量),多余的变量会被设成undef
右侧(标量)>左侧(变量),自动忽略多余的标量
「数组只能包含标量,不能包含其他数组,即数组无法成为列表中的元素」
「splice操作符:」
用于删除或替换
向列表指定位置追加元素,可以将length设为0即可
#offset:起始位置;length:替换的元素个数;list:替换元素列表
splice @array, offset [, length[, list]];
「split函数将字符串转为数组」
pattern,分隔符
expr,指定字符串数
limit,返回该数组元素个数
split [pattern, [expr, [limit]]] string;
「join函数将数组转换为字符串」
expr,连接符
list,列表或数组
join expr list;
「sort函数对数组排序」
1.大写字符排在小写字符前面
2.数字排在字母前面
3.标点散落在各处
「each操作符」
遍历数组元素,返回元素的索引值和元素的值
use 5.012;
my @rocks = qw/earth moon spark star/;
while(my($index,$value) = each @rocks){
say"$index:$value";
}
# 等效于:
@rocks = qw/earth moon spark star/;
foreach$index(0..$#rocks){
print"$index:$rocks[$index]\n";
}
「reverse操作符」
读取列表(数组)的值,并按相反的次序返回该列表
不会修改列表的值
「哈希变量:一个key/value对的集合」
键值对之间的逗号可以使用“=>”表示
%data = ('earth',100,'moon',80,'spark',50);
「访问哈希值:」
$data{earth};
「返回哈希所有的keys」
keys %data;
「展开哈希」
@array = %hash;
「哈希赋值」
反序哈希(需要键值对均唯一)
my %inverse_hash = reverse %hash;
「exists函数判断是否存在某个键」
if(exists${"keys"});
「delete函数删除指定的键值对」
delete$hash{"keys"};
「变量上下文」
@data = ('earth','moon','spark');
@copy = @data;#复制数组
$num= @data;#数组赋值给标量,返回数组元素个数
「比较操作符(数字/字符串)」
==(or eq) #相等
!=(or ne) #不等
<(lt) #小于
>(gt) #大于
<=(or le) #小于或等于
>=(or ge) #大于或等于
获取用户输入
$l= ;
「布尔值」
1.如果是数字,0为假,其他所有数字都为真
2.如果是字符串,空字符为假,其他所有字符为真
3.如果既不是字符串也不是数字,先转换为数字或字符串再判断真假
4.字符串“0”跟数字“0”是同一个标量,字符串“0”是唯一当成假的非空字符串
5.布尔值取反:!
「chomp操作符」
去除行末的换行符
$text="a line of text\n";
chomp($text);
chomp($text= );
「while控制结构」
只要条件为真,就会不断执行代码块
$count= 0;
while($count< 10){
print"count is now$count\n";
$count+= 1;
}
「foreach控制结构」
逐项遍历列表中的值,依次迭代
### 在循环中若修改了控制变量的值,则会同时修改列表中的元素
my$word;
foreach$word(qw/earth moon spark star/){
print"The planet is$word\n";
}
「undef值」
用于构造数字累加器 累加一些奇数
my$n= 1;
my$sum;
while($n< 10){
$sum+=$n;
$n+= 2;
}
print"The total was$sum\n";
「defined函数」
判断某个字符串是undef而不是空字符
#如果是undef返回假,否则返回真
$string= ;
defined($string);
「Perl的默认变量:$_」
#例如在foreach循环开头省略控制变量
foreach(1..10){
print"I can count to$_.\n";
}
「标量上下文与列表上下文」
大家中学时代做语文阅读的时候总会有一道题——“请你根据上下文分析xxx词在行文中的具体作用”,Perl里面的“上下文”与之类似,同一个表达式在不同的代码上下文,可能会产生不同的含义
my @people = qw/abc cde bcd/;
#列表上下文
my @sorted_people = sort @people;
#标量上下文
my$num= 100 + @people;
print@sorted_people$num;
#运行结果:abc bcd cde 103
强制指定标量上下文
my @rocks=qw/abc bcd cde/;
print"I have", scalar @rocks,"rocks!\n";