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 = $a x 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; #数组赋值给标量,返回数组元素个数

「比较操作符(数字/字符串)」

  1. ==(or eq) #相等
  2. !=(or ne) #不等
  3. <(lt) #小于
  4. >(gt) #大于
  5. <=(or le) #小于或等于
  6. >=(or ge) #大于或等于

获取用户输入

$l = <STDIN>;

「布尔值」

1.如果是数字,0为假,其他所有数字都为真
2.如果是字符串,空字符为假,其他所有字符为真
3.如果既不是字符串也不是数字,先转换为数字或字符串再判断真假
4.字符串“0”跟数字“0”是同一个标量,字符串“0”是唯一当成假的非空字符串
5.布尔值取反:!

「chomp操作符」

去除行末的换行符

$text = "a line of text\n";
chomp($text);
chomp($text = <STDIN>);

「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 = <STDIN>;
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";
posted @ 2022-07-19 16:10  华大基因学院  阅读(95)  评论(0编辑  收藏  举报