noHup - 脚本编程
type: channel
link: http://chris.nohup.cc/tag/脚本编程/
items: Perl处理文件Tips

Perl处理文件Tips
type: item
date: 2015-08-01T08:51:00+00:00
description: Overview 最近经常需要使用到Perl处理文件，因此在此记录一下经常使用到的Perl知识。 1. Perl脚本中接受命令行参数 很多时候我们编写一个Perl脚本，都是用来处理一个文件，输出为另一个文件，例如，脚本file_converter.pl将input.txt中的格式处理之后转化为另一种格式存储在output.txt中，则通常我们的使用习惯是 ./file_converter.pl input.txt output.txt 在Perl脚本中可以使用@ARGV获取命令行的参数，上面的例子中，@ARGV的值为2，使用$ARGV[0]和$ARGV[1]几个获取到这两个文件名字，示例如下： if (@ARGV != 2) { print "==Error: Please input the file you need to convert and the file name of the result\n"; } my $original_file_name = $ARGV[0]; my $output_file = $ARGV[1]; 2. 判断要使用的变量是否已定义or已赋值 在使用一个变量时，有时需要先判断这个变量是不是第一次被使用，这时我们通常可以选择定义此变量时只声明，不赋值。而在使用时，使用两种方式判断该变量是不是已经被赋值了。代码如下： my $name_not_init; my $name="Gly"; if(!$name_not_init) { print "null\n" } else { print "not null\n"; } if(defined($name_not_init)) { print "defined\n"; } else { print "not defined\n"; } if(!$name) { print "null\n" } else { print "not null\n"; } if(defined($name)) { print "defined\n"; } else { print "not defined\n"; } 运行结果为： null not defined not null defined 即当一个变量只是被声明，未被赋值之前，都是未定义的，$name_not_init和defined($name_not_init)都为假。 但是，当对数组变量使用defined时，会报一下诊断信息： defined(@array) is deprecated （D-废弃-反对-可选）通常defined对数组并没有作用，因为它只是检查一个未定义的标量值。可以使用刚才说的另一种方式： if (!@array) { #数组为空 } 3. 获取数组长度 非常简单，直接将一个数组变量赋给一个普通变量或者使用scalar，示例如下： my $count_array = @line_texts; #method 1 my $count_array = scalar @line_texts; #method 2 4. 从网页获取数据 直接使用一段代码展示，该代码从http://www.uniprot.org/uniprot/P01282.fasta处请求内容，这个网站是一个蛋白质序列信息查询网站，如果查询的ID信息存在，则返回该序列的信息，格式如下： #>sp|P01282|VIP_HUMAN VIP peptides OS=Homo sapiens GN=VIP PE=1 SV=1 MDTRNKAQLLVLLTLLSVLFSQTSAWPLYRAPSALRLGDRIPFEGANEPDQVSLKEDIDM LQNALAENDTPYYDVSRNARHADGVFTSDFSKLLGQLSAKKYLESLMGKRVSSNISEDPV PVKRHSDAVFTDNYTRLRKQMAVKKYLNSILNGKRSSEGESPDFPEELEK 以上数据以每一行之后以空格结尾，第一行为序列描述信息，我们需要的是提取第一行数据之外的序列详细信息，并去掉每一行之后的空格，我们需要的是以下结果： MDTRNKAQLLVLLTLLSVLFSQTSAWPLYRAPSALRLGDRIPFEGANEPDQVSLKEDIDMLQNALAENDTPYYDVSRNARHADGVFTSDFSKLLGQLSAKKYLESLMGKRVSSNISEDPVPVKRHSDAVFTDNYTRLRKQMAVKKYLNSILNGKRSSEGESPDFPEELEK 如果查询的ID信息不存在，则会返回一个包含Not found的网页，此时我们使用-代替序列内容。 完整代码如下: #!/usr/bin/perl -w #载入Web请求和解析所需要的模块…