10天学会Perl第二天——变量
Posted 生物坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10天学会Perl第二天——变量相关的知识,希望对你有一定的参考价值。
期目录】 [1]
温馨提示:文章内代码可以左右拖动以查看被遮挡部分。
perl变量 简介
Perl的变量(可以理解为一种用来放东西的容器)有三种类型:标量(scalar)、数组(array)和哈希(hashes)每种类型都有属于自己的符号:分别是$、@和%。变量定义(就是创建一个可以来盛放东西的容器)使用my关键字,生命期直到其所在的代码块结束或者文件的末尾。做个比喻,不同的容器类型可以放不同形式的东西,以不同的组织形式放,比如书架和纸箱都可以放书,但显然它们对书本的堆叠方式不同。
本期目录
Scalar变量:Array变量:Hash变量:
Scalar变量:
一个scalar变量能包含:
• undef(空的)
• 数值(Perl不区分整形和浮点类型)
• 字符串
• 其他变量的引用。
1my $undef = undef;
2print $undef; # 打印空字符串"",并且抛出一个警告
3# 隐式的undef(未初始化的变量初值默认为undef):
4my $undef2;
5print $undef2; # 打印"",并且抛出完全一样的警告
6my $chromosome= 46;
7print $num; # "46"
8my $DNA = "ATCG";
9print $DNA; # "ATCG"
10用.运算符进行字符串连接(与php一样):
11print "your chromosome number is:".$chromosome; # "your chromosome number is:46"
Array变量:
Array变量是包含一个scalar列表的、由从0开始的整形数为下标存取的变量。在Python里被称为list,而在PHP里被称为array。数组可以用一个圆括号包围的scalar列表来声明(译者注:原文declaration,而这里实际表达的含义应为“初始化”,而不是对于变量标识符的声明,下同):
1my @codonlist=(
2 "AUG",
3 "AGU",
4 "GAU",
5 "GGG",
6 "...",#最后一个scalar变量"..."后边的逗号可有可无
7 );
8#你必须要使用美元符号来存取array中的值,因为取到的值是一个scalar而非array:
9print $codonlist[0];#结果是"AUG"
10print $codonlist[1];#打印出第二个scalar变量,即"TGU"
11print $codonlist[5]; # 返回undef,打印""并且抛出一个警告,因为没有第7个
12#你也可以使用负数作为下标,这样就可以从末尾开始往前取某个元素:
13print $codonlist[-1];#打印出最后一个scalar变量"..."
14#以此类推,有
15print $codonlist[-2];#打印出倒数第二个scalar变量"GGG"
16#同样
17print $codonlist[-6]#返回undef,打印""并且抛出一个警告
同时定义了两个叫相同名字的scalar变量$var和包含scalar元素$var[0]的array变量@var是没有冲突的(计算机是可以区分的),不过会对代码的读者造成一些误导,所以请避免这种情况。
取得array的长度
1print "This array has ".(scalar codonlength)."elements"; # "This array has 5 elements"
2print "The last populated index is ".$#codonlist; # "The last populated index is 4"
调用Perl脚本时使用的参数列表被保存在内置的array变量@ARGV中。
变量可以被插入到字符串中被求值:
1print "your chromosome number is:$chromosome"; # "your chromosome number is:46"
2print "@codonlist"; # "print these strings out for me"
1print "your chromosome number is:$chromosome"; # "your chromosome number is:46"
2print 'your chromosome number is:$chromosome'; # your chromosome number is:$chromosome
3print "@codonlist"; # "@codonlist"
4print '@codonlist'; # "@codonlist"
Hash变量:
Hash变量是包含一个scalar列表的(一堆scalar变量)、由字符串为下标存取的变量。就好比我们拿到了一本字典就可以根据目录找到某个字的具体解释一样,字典存取了目录和具体字词解释的一一对应关系,使得我们可以通过目录找到字词解释,hash变量也是这样存储和读取的。
1my %chromosome1 = (
2 "gene1" => "AAAAA",
3 "gene2" => "ATATAT",
4 "gene3" => "GAGAGA",
5);
请注意这个声明与array何其相似。事实上,这个双箭头符号=>被称为“fat comma”(胖逗号),因为它与逗号完全等价。Hash变量由偶数个元素组成的列表来声明,其中偶数下标(0、2、……)的元素都被当做字符串使用。
与array一样,你也需要用美元符号来存取hash中的值,因为取到的值是scalar而非hash:
1print $chromosome1{"AAAAA"}; # "AAAAA"
2print $chromosome1{"ATATAT"}; # "ATATAT"
3print $chromosome1{"GAGAGA"}; # "GAGAGA"
4print $chromosome1{"gene4"}; # 返回undef,打印""并且抛出一个警告
注意在这里使用的花括号。同样的,同时存在scalar变量$var和包含scalar元素$var{"foo"}的hash变量%var是没有冲突的。你可以将一个hash转换为两倍数量元素的array,原先hash中的键和值在转换后的array中交替出现(反向的转换也同样简单):
1my @chromosome1 = %chromosome1;
然而有一点与array不同,hash中的键没有特定的保存顺序,而是以一种比较高效的方式进行存储。因此,需要注意转换后的array会将hash中的键值对重新排列次序:
1print "@chromosome1"; # 输出可能是"AAAAA ATATAT GAGAGA"
回顾一下,我们使用方括号来取array中的值,而使用花括号来取hash中的值。方括号是一个有效的数值运算符,而花括号是一个有效的字符串运算符,因此事实上,作为下标的值是数值还是字符串类型其实并不重要
1my $data = "orange";
2my @data = ("purple");
3my %data = ( "0" => "blue");
4
5print $data; # "orange"
6print $data[0]; # "purple"
7print $data["0"]; # "purple"
8print $data{0}; # "blue"
9print $data{"0"}; # "blue
-
- 10天perl自学之往期目录:
生物坊
专注做生信的引路人
不做具体技术细节的推广
以上是关于10天学会Perl第二天——变量的主要内容,如果未能解决你的问题,请参考以下文章