perl语言基础命令

Posted BIOMAMBA科研笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了perl语言基础命令相关的知识,希望对你有一定的参考价值。

没有文案,上干货:

1972年c语言诞生,perl1987年也应运而生。全称为:Practical Extraction and Report Language。




特点:
1、简单:无需事先声明,不用区分整型、字符串等
2、快速:利用perl解释器可以直接运行脚本
3、多样:包含了C/C++、Basic、Pascal、awk、sed等多种语言
4、应用:文本处理、wed网站(具有TCP/IP通信能力)、数据库处理
学习笔记:https://www.bilibili.com/video/BV1px411e7gc?p=2 #windows安装perl的教程perl -v #可以查看版本信息 linux下位perl -versionperl脚本第一行 :#!perl编译器路径,一般为#!/usr/bin/perl
perl -w 脚本.pl #开启内建警告信息perl -c #预运行,检查脚本中是否有错误,正确会回复 syntax ok或在第一行直接 #!/usr/bin/perl -w5.6以后的版本#!/usr/bin/perluse warningsuse 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 $alocal $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"#输出helloworld5x4#结果为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
三、条件语句:
1if结构: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结构
2unless结构,unless后面的条件为假时候,才执行后续
3for循环: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=0while($data=0)while($data<200){$sum+-$data;$data ++;if($data > 180){printf("a");last;printf("b");}}#last跳出的是while循环,而不是if循环,(跳出最大的循环)
4foreach结构foreach 变量(列表/数组){tab执行语句;}#依次读取变量,确保每一个元素都会读取到,不会少读也不会超出,与哈希一样是没有顺序的
例子:@array = (1,2,3..50,51,53..99);foreach $item(@array)#依次读取数组中的值{tab if($item > 60)tab {tab printf("$item\n");tab}tab}

四、控制结构1while结构while(条件)执行语句#返回值为真时执行语句,否则退出循环,控制循环的方法有:1)计数控制:循环执行的次数是预先设定好的,例如:$count =1;$sum=0while($count <=100){$sum+=count;$count++;}
2)特殊值控制:通过对变量进行判断,来决定程序是否执行3)用户交互值控制:通过显性询问用户的意见来判断是否执行程序
2until结构until(条件)执行语句#条件返回值为假时,才执行循环内的代码
until(条件)执行语句1continue执行语句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个或多个xx*#匹配0个或多个xx+#匹配一个或多个xx(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)模式替换,返回值为布尔量(返回10s/匹配的字符/替换的字符/#修改时不支持特殊字符选项:/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
deletedelete $hash(值);#删除哈希的值
keys#返回hash所有下一级键的列表,返回顺序是随机的,即不等于赋值时的顺序@array=keys%hashforeach $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#只有预先定义了子程序时,&与()都可以省略,因此最好还是别省略了吧。其他列表、标量等都不会出现圆括号
&namesub 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值,失败返回undefclose 句柄;#完成对文件的操作后将句柄关闭,通知操作系统此句柄可重复使用,尚未为文件句柄写入的数据可以写入到磁盘当中#操作系统只允许打开规定数量的文件句柄
2die函数open(FILE,pathname)||die;open(FILE,pathname) or die;#未能正确执行时输出报错信息并提示行号die "自定义报错"#得到的是自定义报错内容及默认报错内容$!#只有在出现错误时,$!为系统所需要的最后一个操作的出错消息,否则可能为空,或是任意值,如:open(FILE,pathname) or die "Cannot open myfile: $!\n";#则只会返回双引号内的内容,不会再返回一次默认报错内容
3warn "提示信息"#用来发出警告但不会终止程序
(三)、读写文件1、读入文件:使用输入操作符(尖括号运算符、钻石符)open(FILE,"pathname") || die "Can't open the file";#打开文件,FILE即句柄$line=<FILE>#利用FILE句柄读取文件,只读取文件的一行(读取行尾前的文本流),文件被读完时返回值为空undefwhile($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模块的安装路径,小写的Lperldoc perldoc#查看perldoc自身的帮助文档
14、格式转换程序见fastq2fastqopen IN,"zcat $ARGV[0] |;#读入压缩文件
PS:$_#默认输出变量,即使什么都不写,如print#也会直接输出$_默认变量$0#代表这个程序本身$!#$/="\n"#设置默认分隔符,例如读取fasta可以用 $/=">"指定>为分隔符die "提示" #终止程序并输出相应提示warn "提示"#不终止程序仅输出相应提示-e "filename"#检查某个文件是否存在


以上是关于perl语言基础命令的主要内容,如果未能解决你的问题,请参考以下文章

在 vim 编辑中使用 perl 单行命令

perl语言基础命令

小动作之perl命令行

Perl基础命令---文件句柄基础

Perl基础速成

perl中的队列