perl语言基础命令
Posted BIOMAMBA科研笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了perl语言基础命令相关的知识,希望对你有一定的参考价值。
没有文案,上干货:
1972年c语言诞生,perl1987年也应运而生。全称为:Practical Extraction and Report Language。
学习笔记:
https://www.bilibili.com/video/BV1px411e7gc?p=2 #windows安装perl的教程
perl -v #可以查看版本信息 linux下位perl -version
perl脚本第一行 :
#!perl编译器路径,一般为#!/usr/bin/perl
perl -w 脚本.pl #开启内建警告信息
perl -c #预运行,检查脚本中是否有错误,正确会回复 syntax ok
或在第一行直接 #!/usr/bin/perl -w
5.6以后的版本
#!/usr/bin/perl
use warnings
use diagnostics#加在下一行可以查看更详细的问题描述
use strict#加在下一行可以让警告时停止运行,出现未声明新变量时会提示,可以避免拼写错误
一、标量:变量的一种类型,Scalar,以$开头,可以在任意位置随时声明并使用,可以是字母或数字,无需定义类型
perl中的数字均为双精度浮点数,标量为单个变量(单数)
1、变量命名规范:
不能以数字开头,不能以数字开头,不能以数字开头,可以以字母、下划线开头
区分大小写,尽量使用小写字母
不采用内部保留变量名
可以以下划线开头后跟数字
未定义的变量在数值中被当作0,在字符串中被认为是空字符串
尽量使用小写字母,避免0o,l1这些字符
如$=10或$=10.00 #=为赋值,==才是数学等于的意思,因此在做判断值是否相等时,需要用==
$gene_num=$gene_num+4 #与$gene_num+=4相同#+可以换成其他运算符
如.=
$DNA.="ATCATCTA"#将该序列连接到$DNA的后面
.#为连接符如$1.$2,在print时.是会被打出来的
5x4#值为5555
"hello" x 3#$_ x 3 hello x 3#同,均是将hello打印三次
用科学计数法时,e可以大写也可以小写
$a=123_456_789
数据可以用_隔开,便于程序员辨识而不影响数值本身
$data = "hello world"#表示字符串标量,可以""也可以'',这样用于区分,与在shell中的用法一样,' '中的字符会被去义,或者用\转意,如果print中想打印单引号、双引号,可以加\
标量在双引号内才能内插替换为相应的值
作用域:一个标量可以被有效访问使用的范围,
分为包变量,
和私有变量:my变量#只在本层模块可以看的到 local变量:在本层和本层的下层函数都可以看到的变量
声明:
my $a
local $a
2、列表(list):是标量的有序集合
列表直接量:逗号分隔元素值,如(1,2,3)#包含3个数字的列表 (1,2,3,)#最后一个逗号会被省略
列表直接量中的元素可以是不同的类型,可以有的可以是字符串,有的是数值
(1..5)#..是范围操作符,代表每次+1直到5,即(1,2,3,4,5)
($m..$n)#列表中可以直接引用标量
3、数组:是标量的有序列表,是多个 标量 数据的合集,是存储列表的变量,可以包含任何多个元素,以@作为标识
@array=[1,"hello",undef,$DNA,5]
#数组的创建,其中的元素可以为数字、字符、甚至标量
a[0]#0是数组的元素,作为标量数据,perl中[]中的下标从0开始,如$array[0]=1,@array代表整个数据,@array[0]可以提取数组中的1号元素,但最好写成$array[0]
$#array #输出数组的最后一个脚标符号 ,因此数组元素个数为$#array+1
起始元素到终止元素的顺序是确定的,元素值可以是数字,也可以是字母
构建列表 @number=(1..100)
qw() #省略字符串的引号 如@strings=qw(red blue green)
split#以指定分隔符分隔标量,则可以将标量分隔得到数组,作用和awk OFS= 类似
如$scalar="abc:asd:fww:sdf";
@array = split /:/,$scalar,4;#格式为 数组 = split /分隔符/,要分隔的标量,分隔的数量
#分隔的数量可以不写
join#指定分隔符连接数组,生成标量
如$newscalar=join ":",@array;#指定:连接数组array中的值
foreach $标量(数组) {
tab print "$标量\n";
}#取数组中的值赋给标量,循环打印
pop @数组 #取出数组中的最后一个元素,即数组中最后一个元素将会被剔除
$value=pop @array;
push (@数组,5);#将5添加到数组的末尾
$标量=shift @数组; #取出数组中的第一个元素,原数组中第一个元素就没了
$标量=unshift @数组,check,test; #将check、test两个元素添加到到数组的开头
#以上函数只能对数据进行操作
sort命令
sort reverse @数组#反序,也可以排序标量
sort reverse(@number)#从大到小排列
如sort{$a<=>$b}@array#按照从小到大排列array,比较的是数字
sort{$a cmp $b}@array#同上,比较的是字符串
@number_sort=sort (@number);#排列@number并赋值给新数组
#reverse函数既可以用于数组,也可以用于标量
4、数字操作符(算术运算符),用字符串加减时,从左边起第一个字母后的字符都会被抛弃
+ - * /
%#取模(就是取余数) 如$data3=18%4结果为2 ,也可以对标量取余,如$2%$1,
操作数不是整数时,会对操作数取整后运算
**#乘幂,如果超过了显示屏显示范围则会显示inf
-#单目负操作符连用要加括号,否则--为自减操作符
字符串连接可以用. 例如 print "hello" . "world"#输出helloworld
5x4#结果为5555 5*4#结果是20
自身运算简写:
$data1=$data1 + 2#等同于 $data1+=2
$data1=$data1 - 2#等同于 $data1-=2
$data1=$data1 * 2#等同于 $data1*=2
$data1=$data1/2#等同于 $data1/=2
$data1=$data1 **2#等同于 $data1 **=2
$data1=$data1 %2#等同于 $data1 %=2
5、标量运算中的优先级
单目操作符优先级高于双目操作符,位运算高于逻辑运算高于赋值运算#自加操作符比乘法优先级高
计算的优先级大于赋值,
括号可以改变优先级,括号的优先级最高
同一优先级要看结合性(即运算符的运算方向):
4**3**2=4*9#幂从右边看
72/12/3=6/3#四则运算从左看
?#条件操作符从右看
赋值操作符从右看
6、标量引用
$test="Hello"#赋值操作
\$test#代表这一变量对应值在内存中的地址
$变量名[索引]#通过索引访问变量内容
软引用:
$scalar="hello"
@scalar=("Hello","World",123)
$refer="scalar" #引用变量名(软引用)
$$refer#解引用
硬引用:
$scalarref=\$foo #标量引用,$foo='hello'
$arrayref=\@arr #数组引用,@arr=1..100
${硬引用}#解引用,可以简写为$硬引用
${数组硬引用}[数组索引号]#数组解引用
二、运算符
1、比较运算符(比较操作符):经常出现在if条件判断中
比较数值 比较字符串
== eq #相等,字符串相等是需要全匹配的
!= ne #不相等
< lt #小于,字符串比大小比的是ASCII码,大写字母码值小,小写字母的码值大,a的码值最小
> gt #大于
<= le #小于或等于
>= ge #大于或等于
<=> cmp #比较,返回的为1,0,-1(大于,等于,小于)
2、逻辑位运算符
||#逻辑或,二者均为假时,返回结果才为假
&&#逻辑与,二者均为真时,返回结果才是真
!#逻辑反
3、其它运算符
++#自加运算符,值加1
--#自减运算符, 值减1
#自增/自减运算符放在 数值 左边,变量本身及返回值立刻发生改变,
运算符放在右边,返回值为原值,但变量本身要下一次才能发生变化,即有从左至右的读取顺序
如果放在变量旁边,无论左右,都是先返回,再自增/减
不能在变量的两边均使用自增自减运算符
字符串.字符串#连接字符串
x#重复运算符, $string1 x 2即将string1打印两遍
,#前面的运算符先行运算
$result=$var==0?14:7;#条件运算符,$var的值如果为0,则输出14,否则输出7
#$condvar==43?$var1=14:$var2=14
三、条件语句:
1、if结构:
if(条件) 执行语句#语法一,条件正确则执行,条件错误则跳过,只适用于执行语句只有一个的情况,
#if条件满足后仅执行一次就跳出条件框,无法做循环,而while可以用作循环执行多次
if(条件){
tab 执行语句一;
tab 执行语句二;
tab}#语法二
if elsif#多条件语句
if(条件一){
tab执行语句;
tab}
elsif(条件二){
tab执行语句;
tab}
tab else{}#遇到真以后就会跳出if语句,如果都没执行则会跳到else来执行
例子:
if (4>3) {
tab print "right\n";
} else{
tab print "wrong";
}
$count=0;
whlie ($count < 10){
tab $count+=2;
tab print"count $count\n";
}
or#当前面判断为假时执行后接的命令
if结构里的执行语句可以继续内嵌if结构
2、unless结构,unless后面的条件为假时候,才执行后续
3、for循环:
for(初始化式;条件;表达式)
tab{
tab执行语句;
}#执行初始化式,条件判断,表达式求值,重复第二步和第三步,条件为假时则跳出整个for循环
一个数组赋值给一个变量的时候,赋值的是这个数组的元素数量
如:
!#usr/bin/perl -w
@array = (1,2,3..50,51,53..99);
$length_array=@array;
for( $i=0;$i< $length_array;$i++) #这里$0是被考虑到了的,因为++放在右边,则$i的返回值为原值
{
if($array[$i]>60)
{
printf"item $i, value is:$assay[$1]\n";
}
}
next#跳至本次循环的结束位置,开始下一个循环
last#直接跳出循环(最大的循环)
如:
$data=0;
$sum=0
while($data=0)
while($data<200)
{
$sum+-$data;
$data ++;
if($data > 180)
{
printf("a");
last;
printf("b");
}
}#last跳出的是while循环,而不是if循环,(跳出最大的循环)
4、foreach结构
foreach 变量(列表/数组)
{
tab执行语句;
}#依次读取变量,确保每一个元素都会读取到,不会少读也不会超出,与哈希一样是没有顺序的
例子:
@array = (1,2,3..50,51,53..99);
foreach $item(@array)#依次读取数组中的值
{
tab if($item > 60)
tab {
tab printf("$item\n");
tab}
tab}
四、控制结构
1、while结构
while(条件)
执行语句#返回值为真时执行语句,否则退出循环,控制循环的方法有:
(1)计数控制:循环执行的次数是预先设定好的,例如:
$count =1;
$sum=0
while($count <=100)
{
$sum+=count;
$count++;
}
(2)特殊值控制:通过对变量进行判断,来决定程序是否执行
(3)用户交互值控制:通过显性询问用户的意见来判断是否执行程序
2、until结构
until(条件)
执行语句#条件返回值为假时,才执行循环内的代码
until(条件)
执行语句1;
continue
执行语句2;#条件为假时执行语句1、2,这两个语句是同时执行的
3、switch结构#perl源码中不支持switch
4、back结构
back:
goto back#回到back的位置
五、perl正则表达式
1、匹配模式
$_="ab"
if(/a/)#检查a与$_是否匹配,这里a、b可以为$变量,a不能加引号
Unicode#利用字符属性匹配(是否含有字母、数字、下划线等特殊符号):
if(/\p{Space}/)#$_是否包含空格
\p{Space}#代表空格、换行符
\p{Digit}#匹配数字
\p{Hex}#16进制数
\P{属性}#包含不匹配这个属性的元素则为真
2、模式分组:利用小括号来进行字符串的分组#这以部分由于版本原因,可能会有点出入
/world+/#匹配worldddd这种worl后面d重复的$_
/(world)+/#匹配world整个字符串重复的$_,重复1次或无数次
/(world)\3/#表示再次匹配world三次,即一共匹配四次
/(a)(b)\1\2/#再匹配a一次,再匹配b2次,第一个括号匹配到的值传递给变量$1,第二个括号里匹配到的值为$2
/a|b/#匹配a或者b的任意一个
/a(|b)c/#匹配ac或者abc
3、元字符(起通配作用),基本和shell里的相同
.#匹配换行符以外的任意字符
[0-9]
[a-z]
[^a-z]#取反
\d#匹配单个数字,\w
\D#匹配非数字字符 \W
\s#匹配空白字符
\S#匹配非空白字符
\n#换行
\t#分隔符
\n#回车
\f#进纸符
\b#回车键
\0#匹配空值字符
锚定符:
^#匹配行首
$#匹配行尾
\A#匹配字符串开头
\b#匹配字边界
\B#匹配非字边界
\Z#匹配字符串或行的末尾
\z#只匹配字符串的末尾
\G#匹配前一次??????????????
重复字符:
x?#匹配0个或多个x
x*#匹配0个或多个x
x+#匹配一个或多个x
x(m,n)#匹配m到n次数的x
(a|b|c)#匹配其中的任意一个
\c#control
元字符优先级:
()
量词#计数的元字符
错位和序列#锚定字符
择一竖线|
通配的一些单字
4、正则表达式
(1)模式匹配
匹配:
m/<字符>/#是否匹配字符
/<字符>/#同上
m不能赋值给变量
$test="china";
$target=".*ina";
$test=~m/$target/#匹配返回1,不匹配返回0
$result=$test=~m/$target/#无论是否匹配,test的值不会发生变化,result的值为0或1
匹配选项:在//的后面加上
g
~/匹配字符/g#所有匹配到的返回出来,而不仅仅是取0和1的返回值
如:@数组 = "字符串"=~/字符/g#将匹配到字符的字符串中的内容都取出来放在数组中
忽略大小写
m#将变量视为多行
s#将变量视为单行
x忽略模式中的空白
(2)模式替换,返回值为布尔量(返回1或0)
s/匹配的字符/替换的字符/#修改时不支持特殊字符
选项:/e#将替换的是表达式结果的替换值
tr/匹配到的原字符/替换的字符 #依次、逐个、对应的替换,字符之间不用加分隔符,返回值为替换的个数,可以用于计数
如$str=~tr/0-9/0-9/#统计str里数字的个数
选项:
c#把匹配项以外的换成空格
d#删除所有指定字符
s#多个相同的输出字符缩成一个
如$result =~tr/字符//cs#把除了指定字符以外的都替换为一个空格
(3)正则的原则
不能对数组、哈希进行模式替换,如需操作,则需先取出来
匹配、替换默认的只操作最早的一次
print的时候只print结果
正则表达式返回值有两种情况:布尔值与反向引用
~m产生的就是布尔值
$a=~s/(word1)(word2)/$2$1/#反向引用
利用|来分隔匹配的字符,增加匹配的灵活性
(?...)#正则表达式的扩展功能
~m/前缀(?:后缀1|后缀2)/
(?!查找内容)#负向预查,在任何不匹配pattern的字符串处开始匹配查找字符串
10、去除换行符(回车换行符)
chomp($标量)#去除文件结尾换行符,在读取文件时使用
chop($标量) #去掉文件结尾的一个字符
换行符:
\n#linux
\r#mac
\r\n#windows
#不同系统的换行符不一致,因此Windows下的文件可以dos2unix转化后再打开
六、哈希:可以容纳很多值,包含很多标量,数组以角标来进行检索,哈希以名称检索,也被称为散列
1、基本概念:
由键和值两部分组成,键和值可以是任何的标量,键的取值必须唯一,值可以重复
%哈希#哈希的格式以%开头,命名时不能以数字开头
定义哈希的时候用%,但是取值时用$
哈希也被称为关联数组
比如将fasta存为哈希,则可利用序列名称作为索引找到序列,为程序设定选项参数提供便捷,注意!哈希是无序的!
2、多维哈希:即值也可以作为下一级值的键
如$class{"小李"}{"English"}
%{$class{小李}}
my %hash = (
"fruit" => {
"round" => "apple",
"round2" => "pear",
}
"book" => {
"red" => "kind of the queen",
"grenn" => "the forest",
}
);#创建多维哈希
3、创建哈希
赋值方式一:
%phone=();#创建一个空哈希
$phone{"zhang"}=1321465464;
$phone{"li"}=16516446;
$phone{"wang"}=35465165165;
$hash{"key1"}{"key2"}=value2#将多个键赋为同一个值
赋值方式二:
%phone=("键",值,"键",值,"键",值,"键",值,);#赋值时需注意这个哈希之前是否用过,用过则需先清0,
这里逗号可以换为=>,便于区分
赋值方式三:
%number = (
"A"=>5,
"B"=>6,
"C"=>7
);#赋值结束用,整个语句结尾时才用;
赋值方式四:
%hash_A=%hash_B#与其他语言不同,这里赋值时两个哈希不会指向同一个地址,而是分别存贮,即改变A的值并不会影响B
取值方式:
foreach my $key(keys %hash)#利用keys函数取得所有的键值给$key
4、哈希切片
my %hash_A = ("thing"=>"book","food"=>"fruit")
my @array = @hash_A{"thing","food"}#用哈希的键值将哈希的值提取出来,存在数组里,这里一定要用大括号
@hash_name{"键1","键2"}
5、哈希的合并
%新哈希名=(%hash1,%hash2)#如果两个哈希中存在相同的键,则后面的键会覆盖前面的
6、哈希函数
exist:判断哈希中是否存在对应键值
exist $hash_name{键值}#返回值为0则说明hash元素值不存在,返回值1则存在(空值返回也是1)
each:返回2个元素的列表,分别为键和对应的值
($key,$value)=each(%hash)
@array = each(%hash)
print @array#两种取值方式,each按内存中的顺序从上往下读取,但哈希本身没有顺序,但不会重复,可以被其他代码所间隔
ENV
%ENV#特指当前环境变量的哈希,键是变量名,值是变量值,可以用each函数取出值
reverse#将哈希的键和值互换
%hash_B=reverse%hash_A
delete
delete $hash(值);#删除哈希的值
keys
#返回hash所有下一级键的列表,返回顺序是随机的,即不等于赋值时的顺序
@array=keys%hash
foreach $key2(keys %{$hash_B{$key}}
print $key2 #取得二级键
values
#返回hash下一级值的列表
@array=values%hash
7、哈希实例
获取哈希的长度(一级键的个数)
对于数组来说,$length = @array,得到的值为数组元素的个数
$length=%hash#返回复合值:内存块数/内存空间,即反应的是哈希的储存效率
$length=keys %hash#即可得到哈希的长度,即键的个数
$a=length ($b)#用length函数统计$b有多少个字符,注:length函数不能用来统计数组!!!
哈希排序
sort
$a cmp $b#按照从小到大的字母ASCII值进行排列
$a <=> $b#从小到大的数字进行排列
$key(sort{$b cmp $a} keys %hash)#按顺序获得键
foreach (sort{$hash{$a} <=> $hash{$b}} keys %hash)值一样时,排序无先后顺序
hash的引用
$href=\%hash#得到哈希的地址,引用时本身的值是会发生改变的
$href={"key1" => abc, "key2" => abcd}#匿名哈希也可以引用
%{$hash{第一级键值}}#代表的是这一个键与下一级值组成的哈希
hash解引用
$href=\%hash#取引用
%{$href}#解引用,与%hash的作用相同
${$href}{"fruit"}#等价于$hash{"$fruit1"}
$href->{"fruit1"}#解引用
foreach my $key(sort{$ENV{$a} cmp $ENV{$b} or $b cmp $a} keys %ENV)#先按值得大小排序,值相同得情况下以键的大小进行排序
将一个二列数据转换为哈希
use Data::Dumper;#设置模块
%hash()
open IN,"<$ARGV[0]";
while (<IN>) {
tab chomp;
tab @line=split/\s+/,$_;#\s+为匹配任意数量的空白符(大于1次)
tab $hash{$line[0]}=$line[1]};
tab print "@line\n";
}
close IN;
print Dumper(\%hash);#将列表文件转换为哈希
@key=keys %hash;#用keys函数取出哈希的键存在数组中
@value=values %hash;#最开始设置完dumper模块后用values函数取出哈希的值存在数组中
@temp=sort keys %hash;
foreach (@temp){
tab print "$_\n";
tab print "$hash{$_}\n";#排序哈希的键并打印
while (($key,$value)=each %hash){
tab print "$key\t:$value\n";
}#打印哈希的一种形式
if (exists $hash{键}) {
tab print "$hash{键}";
}
七、子程序
1、定义:执行一个特殊任务的分离的代码,可以重复使用,可以出现在程序的任何地方,又称为函数,调用方式可能会有所不同
2、用处:用子程序将长脚本分解为小的片段、把常用的操作分为独立的单元
3、语法
#命名时尽量避免全大写命名,因为perl很多自带函数为全大写命名,最好加一些下划线之类的字符定义自己的程序和变量
sub Name #声明一个名词为Name的子程序
sub Name BLOCK #BLOCK为子程序的内容
#子程序体需要使用花括号括起来
#子程序可以从外部导入
#被传递的参数可以通过Perl的特殊变量@_访问
4、调用方式
Name(LIST) #LIST为参数列表,参数列表不只一个时用,隔开
Name LIST
&Name#只有预先定义了子程序时,&与()都可以省略,因此最好还是别省略了吧。其他列表、标量等都不会出现圆括号
&name
sub name{定义内容}#先调用后定义,&用于告诉perl解释器,后面接的是一个子程序
do Name(LIST);#用do使解释器明白这是一个子程序
5、返回
子程序调用后会以值得形式返回:字符串、数字值、布尔量、空
默认子程序最后一个语句的值会用作返回值,可以用return指定返回值,但是return下一行及之后的语句会被跳出
my $result = add (1,2)
print $result#$result取得就是返回值
return $var#指定var为返回值
6、参数传递:联系主函数与子函数
@_#代表所有子程序的输入参数列表,参数列表是有顺序的
sub add
{
my ($number1,$number2,$number3)= @_;
$number1 = $number1+1;
$number2 = $number2+2;
$number3 = $number3+3;
$val = $number1+$number2+$number3;
return $val
}#即指定$number1,number2,number3为指定参数,之前没指定是因为用@array = @_,这样可以用foreach函数来依次取出数组@array
#这样将参数名改成与原输入参数名不同的,可以不改变原来参数的值,即使是用相同的名称,也是使用不同的内存块去储存,这样即使同名,两个变量之间也没有关系
#参数为数组时,所有数组合并被赋值给子程序的参数列表中第一个数组,多余的数组变量为空
#调用时输入得参数需与指定参数相一致,否则会报错
如:
sub add
{
my (@array1,@array2) = @_;
print "array1: @array1\n";
print "array2: @array2\n";
}
my @test = (1,2,3)
my @test2 = (3,4,5)
my $result = add @test,@test2;
print "$result\n";
#则@_的值为:1,2,3,3,4,5
my ($val,@array) = @_
#可以将标量与数组传递给一个参数列表
7、子程序的局部变量
变量是有作用域的,一般子程序中的变量作用域即在当前的子程序之中,可以通过my来识别局部变量的特征
my $变量 #仅在这个变量所属的block内有效,在子程序中也看不到
local $变量 #全局变量,在上一级无法被识别,但是在本级及其子函数中可以被识别,不加local也默认为全局变量
#主程序里与子程序的变量最好用不同的命名方式,在用参数传递,防止混淆
通过引用的值来传递变量
八、综合实例:见附件
九、文件处理
(一)、句柄:
定义:
perl可以通过句柄与perl以外的环境(硬盘文件、内存、终端输入输出),联系(输入输出)
是一个顺序号,是打开文件的唯一识别依据
是一种特殊的数据类型
句柄只能代表文件,读取文件时要用钻石操作符
1、间接文件句柄:是有效的perl标识符,字符串、标量、函数、大小写字母、下划线数字组成
不同与其他变量,间接perl句柄没有标志性的前缀
为了与自定义句柄区别,一般使用全大写字母表示
输入输出句柄:STDIN,STDOUT,STDERR
(1)STDIN#standardinput
默认的输入间接perl文件句柄,默认是键盘输入
my $data = <STDIN>;#从键盘输入取值给$data
<>#行操作符又称钻石操作符,从命令行指定的文件中读取数据
(2)STDOUT#standardoutput,代表默认输出到终端
默认的输出间接perl文件句柄
发送给该句柄的数据在用户指定的输出设备上显示,通常为命令窗口
如:print STDOUT "here is the example"#原本的输出也是默认到终端,因此STDOUT在这里加不加并没有实质区别
(3)STDERR#standarderror
用于错误信息、诊断、调试和其他类似的偶发输出、默认情况下,STDERR和STDOUT使用相同的输出设备
2、自定义句柄:由用户指定文件,获取该文件的标识
由于perl语言内置有六个文件句柄,因此自定义句柄时因避免使用STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT
STD的三个句柄都是定向到屏幕的 标准输入,标准输出,错误输出,
(二)、打开文件
1、OPEN函数
open(filehandle,pathname)#语法,支持绝对路径与相对路径
#filehandle为句柄名,可以自定义。pathname#文件路径名,如不输入绝对路径,则在perl执行时所在的当前目录执行
#打开成功则返回非0值,失败返回undef
close 句柄;
#完成对文件的操作后将句柄关闭,通知操作系统此句柄可重复使用,尚未为文件句柄写入的数据可以写入到磁盘当中
#操作系统只允许打开规定数量的文件句柄
2、die函数
open(FILE,pathname)||die;
open(FILE,pathname) or die;#未能正确执行时输出报错信息并提示行号
die "自定义报错"#得到的是自定义报错内容及默认报错内容
$!#只有在出现错误时,$!为系统所需要的最后一个操作的出错消息,否则可能为空,或是任意值,如:
open(FILE,pathname) or die "Cannot open myfile: $!\n";#则只会返回双引号内的内容,不会再返回一次默认报错内容
3、warn "提示信息"#用来发出警告但不会终止程序
(三)、读写文件
1、读入文件:使用输入操作符(尖括号运算符、钻石符)
open(FILE,"pathname") || die "Can't open the file";#打开文件,FILE即句柄
$line=<FILE>#利用FILE句柄读取文件,只读取文件的一行(读取行尾前的文本流),文件被读完时返回值为空undef
while($a=<FILE>){
print $a;
}#读取并打印文件所有内容
@array=<FILE>;#将文件赋值给数组时会一次性把文件所有行都读完,当文件比较大时,避免将文件赋值给数组
2、写入文件
open(FILE,">pathname")#覆盖写入原文件,如果该文件存在,则会被清空
open(FILE,">>pathname")#追加写入原文件,括号可以省略
my @array = <RFILE>#读入文件
print FILE @array;#即把原来的文件
print 句柄 "需要打印的内容"#写入具体内容,这条语句中无逗号分隔符
close(FILE)#关闭句柄
binmode#perl无法识别二进制文件与文本文件的差别,利用binmode可以写入二进制文件,如:
open(FH,"camel.gif") || die "$!";
binmode(FH);
print FH "GIF87a\056";
close (FH);#如果不binmode,则输出的结果全是ASCII码
3、(from基因学院)输入与输出
<STIDIN>#取得键盘的输入值,应用:
printf"type the input:\n";
$data=<STDIN>
open IN,"<文件名";#读入文件,以只读的方式写入时<可以省略
open OU,">文件名";#输出文件,>>追加
#IN与OU为文件句柄,即perl中与外界交流的程序名,
#文件句柄有STDIM#标准输入,STDOUT#标准输出,STDERR#错误输出,
DATA,
ARGV#表示命令行后接参数的索引,如$ARGV[0]#命令行第一个参数,$ARGV[1]#命令行第二个参数
ARGVOUT
$标量=<IN>#此标量既可以作为输入也可以作为输出
open IN,"<$ARGV[0]";
$first=<IN>;
$second=<IN>;
$third=<IN>;
open IN,"<ARGV[0]";
open OU.">ARGV[1]";
while ($line=<IN>) {
print OU "$line";
}
close IN;
close OU;#close函数关闭文件的句柄
#读入命令后跟的第一个文件,每次读一行后打印出来,输出到命令后的第二个文件中
(四)、文件测试运算符
测试文件的必要性:读写结束后才能返回结果,读写速度比较慢,会浪费时间 避免读写时错误
-r 'file' #可以读取file则返回值为真
-w w 'file'#文件可写返回为真
-e 'file'#文件存在返回为真
-z 'file'#文件存在,且为空则返回为真
-s 'data'#data存在则返回data的大小(字符的个数)
-f 'file'#file为普通文件则返回为真
-d '/tmp'#tmp为目录则返回为真
-T 'file'#file为文本文件则返回为真
-B 'file'#file为二进制文件则返回为真
-M 'file'#返回file在程序启动以来被修改经过的时间
11、帮助
perldoc#帮助文档 perldoc -f 函数#查看内接函数的作用
-h#给出perldoc的帮助信息
-m 内置函数#输出模块的源代码
-v 变量#输出内置变量的相关信息
-l #查看perl模块的安装路径,小写的L
perldoc perldoc#查看perldoc自身的帮助文档
14、格式转换程序
见fastq2fastq
open IN,"zcat $ARGV[0] |;#读入压缩文件
PS:
$_#默认输出变量,即使什么都不写,如print#也会直接输出$_默认变量
$0#代表这个程序本身
$!#
$/="\n"#设置默认分隔符,例如读取fasta可以用 $/=">"指定>为分隔符
die "提示" #终止程序并输出相应提示
warn "提示"#不终止程序仅输出相应提示
-e "filename"#检查某个文件是否存在
以上是关于perl语言基础命令的主要内容,如果未能解决你的问题,请参考以下文章