noHup - Perl
type: channel
link: http://120.24.231.154/category/perl/
items: 机器学习项目服务器上线部署全流程记录
items: ubuntu14.04安装gearman及perl扩展包
items: 配置Apache2服务器以CGI方式运行Perl程序
items: perl调用系统命令的3种方式
items: BioPerl（三）：巧用BioPerl格式化fasta文件
items: BioPerl（二）：使用BioPerl读取fasta文件
items: BioPerl（一）：安装BioPerl
items: Perl处理文件Tips

机器学习项目服务器上线部署全流程记录
type: item
date: 2018-03-02T06:36:00+00:00
description: Overview1.Java端1.1 安装JDK1.81.2 安装Tomcat71.2.1 配置Tomcat7启动内存1.3 检查安装php和Apache21.4 设置Apache2反向代理1.5 安装MySQL5.71.6 安装配置phpmyadmin2.Perl后台2.1 设置Apache2 CGI2.2 Perl相关模块安装2.3 gearman消息队列安装3. Python相关安装4. R语言及相关包安装 Overview 我们团队完整的机器学习项目已经做了两个了，分别是Bastion4和Bastion6。之前两个项目上线部署的记录过于片段化，针对现在马上要做完的Bastion3项目，我们在此完整记录搭建服务器各种环境的全部流程，以备不时之需。 完整的项目基本分为三大部分：Java处理业务逻辑；Perl后台消息队列；R机器学习模型预测。每个大部分还有很多细节，我们会在每部分都详细记录。 新申请的云服务器预装的仍然是Ubuntu16.04LTS发行版的Linux系统。 1.Java端 Java端负责将用户提交的任务信息提交至后台Perl服务器并记录在MySQL数据库中。因此这部分会安装JDK1.8，Tomcat7和MySQL5.7。 1.1 安装JDK1.8 安装JDK1.8，用apt命令很方便，不用单独下载解压。命令如下： sudo apt-get install software-properties-common -y sudo add-apt-repository ppa:webupd8team/java -y sudo apt-get update sudo apt-get install oracle-java8-installer oracle-java8-set-default -y 安装完成之后，JDK1.8会被安装在/usr/lib/jvm/java-8-oracle中，在/etc/profile或者~/.bashrc中配置JAVA_HOME变量 (我用的是~/.bashrc文件)： export JAVA_HOME=/usr/lib/jvm/java-8-oracle 安装好之后，需要以下命令使配置生效： source ~/.bashrc 1.2 安装Tomcat7 使用以下的命令安装Tomcat7: sudo apt-get install tomcat7 安装过程中，可能会报如下的错误(即使你已经配置好了JAVA_HOME): Jul 09 16:52:16 bastiondb systemd[1]: Starting LSB: Start Tomcat.... Jul 09 16:52:16 bastiondb tomcat7[6413]: * no JDK or JRE found - please...E Jul 09 16:52:16 bastiondb systemd[1]: tomcat7.service: Control process e...1 Jul 09 16:52:16 bastiondb systemd[1]: Failed to start LSB: Start Tomcat.. Jul 09 16:52:16 bastiondb systemd[1]: tomcat7.service: Unit entered fail.... Jul 09 16:52:16 bastiondb systemd[1]: tomcat7.service: Failed with resul.... Hint: Some lines were ellipsized, use -l to show in full. dpkg: error processing package tomcat7 (--configure): subprocess installed post-installation script returned error exit status 1 Errors were encountered while processing: tomcat7 E: Sub-process /usr/bin/dpkg returned an error code (1) 出现这个错误，说明tomcat7已经装好了，但是由于tomcat在启动时找不到JAVA_HOME的路径，所以报错。查看/etc/default/tomcat7，会发现下面这行： #JAVA_HOME=/usr/lib/jvm/openjdk-6-jdk 去掉注释，并改为我们自己的JAVA_HOME路径： JAVA_HOME=/usr/lib/jvm/java-8-oracle 重新运行安装命令： sudo apt-…

ubuntu14.04安装gearman及perl扩展包
type: item
date: 2016-09-13T07:49:00+00:00
description: Overview1.下载安装gearman2.安装perl扩展包3.运行测试perl脚本 Overview Bastion4这个项目经过我们实验验证和安全考虑，决定舍弃kafka而转用gearman这个消息队列框架，具体分析将在后续文章中给出，这里只记录gearman相关的安装。 1.下载安装gearman 最新版的gearman是gearmand-1.1.12。我们执行下面几步，先将其下载到本地主文件夹，并解压缩。 sudo apt-get update wget https://launchpad.net/gearmand/1.2/1.1.12/+download/gearmand-1.1.12.tar.gz tar zxvf gearmand-1.1.12.tar.gz cd gearmand-1.1.12/ 进入gearmand-1.1.12文件夹后，如果直接运行 ./configure 就会报缺少如下几个依赖包错误： configure: error: could not find boost configure: error: Could not find a version of the library configure: error: could not find gperf configure: error: Unable to find libevent configure: error: Unable to find libuuid 所以，我们先将这些依赖都安装好： sudo apt-get install libboost-dev sudo apt-get install libboost-all-dev sudo apt-get install gperf sudo apt-get install libevent-dev sudo apt-get install uuid-dev 安装好之后，如果没有错误，仍在gearmand-1.1.12文件夹下运行下面两条命令，编译时间比较长： sudo make sudo make install 这个过程中如果出现了错误，就运行下面的命令清除一下之前编译产生的可执行文件以及object文件(即扩展名为o的文件)： sudo make clean 继续重新安装编译： ./configure sudo make sudo make install 没有错误的话，就安装gearman的job server： sudo apt-get install gearman-job-server 安装好以后，运行一下gearman: gearman 会提示错误： gearman: error while loading shared libraries: libgearman.so.8: cannot open shared object file: No such file or directory 这表示找不到libgearman.so.8所在的目录。这时我们打开/etc/ld.so.conf文件： sudo vim /etc/ld.so.conf 添加一句话: include /usr/local/lib 保存退出，并执行下面这句： sudo /sbin/ldconfig 这样就不会出错了。 启动一下job server： gearmand -d 报错如下： gearmand: Could not open log file "/usr/local/var/log/gearmand.log", from "/home/young/gearmand-1.1.12", switching to stderr. (No such file or directory) 我们这样解决：在/usr/local/下面新建var子目录，进去，新建log子目录，再进去，新建文件gearmand.log。这样就没有问题了。 用sudo权限运行下面的命令： sudo gearmand -d -L 127.0.0.1 -p 4730 -d表示daemon，在后台运行； -L表示监听的ip，默认是localhost； -p表示监听的端口号port，默认是4730。 这样gearman在ubuntu14.04上面就安装成功了。 2.安装perl扩展包 perl端需要3个扩展包： Gearman::Server Gearman::Client Gearman::Worker 可以用之前Chris的博客BioPerl（一）：安装BioPerl中介绍的方法，先安装好CPAN。 之后，用sudo权限打开CPAN： sudo cpan 然后依次安装3个扩展包： install Gearman::Serv…

配置Apache2服务器以CGI方式运行Perl程序
type: item
date: 2016-07-28T04:34:00+00:00
description: Overview1. Apache2基本配置2. 配置Apache2支持Perl CGI程序2.1 创建一个Perl网站2.2 配置Apache服务器3. 可能遇到的一些错误3.1 500 Internal Server Error3.2 503 Service Unavailable3.3 404 Not Found3.4 403 Forbidden4. 小结参考文章 Overview 这次我们开发Bastion4服务器使用了JAVA+Perl的架构，后端用Perl做服务器提供Webservice，用JAVA框架Struts接收处理用户请求，再跟Perl服务器交互。 我们使用Apache2作为Perl服务器，由于Apache2默认并不支持Perl，因此需要简单配置一下，使得Apache2以CGI的方式支持Perl运行。在配置的过程中，参考了一些网页，但由于各个网页都没有完整地描述配置过程（至少在我们的服务器上是这样），所以这里记录一下我们配置的全过程。 1. Apache2基本配置 我们为Bastion4申请了一个新的云服务器，版本为NeCTAR Ubuntu 16.04 LTS x86_64，自带了Apache2服务器，下面简单列出了Apache2的一些基本信息： /etc/apache2/ Apache2的配置文件目录 /var/www/ Apache2的网站存放目录 /var/log/apache2/ Apache2的日志存放目录 /etc/apache2/apache2.conf Apache2的配置主文件，以前的Apache版本中，主配置文件名字叫httpd.conf，所以很多网页中还用到这个名字，不知道的话会造成很多混淆。尽管apache2.conf是主配置文件，但是多数具体的配置信息并不是写在这个文件中的，/etc/apache2目录中有还有几个文件夹分别记录了几个模块的配置信息，apache2.conf负责把他们导入整合在一起。 /etc/apache2/sites-enabled/ 看名字就可以明白，Apache2的网站配置文件一般都是放在这个目录中的，这个目录下的000-default.conf是我们经常要修改的配置文件。 我们假定Apache存放网站的根目录是/var/www/，如果不确定(因为默认好像是/var/www/html这个目录)，打开/etc/apache2/apache2.conf目录，查看下面的配置： <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> 如果在你的配置里是 <Directory /var/www/html/> 修改成 <Directory /var/www/> 这样，当你把一个名叫Mywebsite的网站(通常是一个文件夹)，扔到/var/www中时，你就可以以http://localhost/Mywebsite/访问到这个网站了。 如果你的配置是<Directory /var/www/html/>，那你需要把你的网站扔到/var/www/html中，才能使用http://localhost/Mywebsite/访问，这是因为<Directory>设置了Apache的根目录，当你使用http://****/Mywebsite访问时，Apache会去当前的根目录/Mywebsite找这个网站。 由于Apache的端口号默认是80，而不加端口号的url访问都会被服务器默认定向到80端口，因此这里不需要添加端口号，如果你手动将Apache端口号修改成了别的端口号（比如8888），那你需要使用http://localhost:8888/Mywebsite/访问这个网站。 2. 配置Apache2支持Perl CGI程序 2.1 创建一个Perl网站 在/var/www下创建网站的目录，我们创建一个名字叫cgi-bin的网站作为例子： mkdir /var/www/cgi-bin 需要使用管理员权限的命令，请自己加上sudo。 在/var/www/cgi-bin中创建一个cgi_test.pl脚本，输入下面的内容： #!/usr/bin/perl -w use warnings; use CGI qw(:standard); #! must use 'my' to define a variable print header; my $now_string = localtime(); print "Hello, CGI using Perl! It's $now_string NOW! "; 为cgi_test.pl添加可执…

perl调用系统命令的3种方式
type: item
date: 2015-12-30T04:10:00+00:00
description: Overview1. 被调用的perl脚本2. 调用脚本testSystemCall.pl2.1 system("command") （推荐）2.2 exec("command");3. `command`3. 参考资料 Overview 有很多时候，我们需要在perl脚本中调用系统命令，比如调用系统的某个软件做一件事。也可以说是在perl脚本中调用外部命令，比如在一个perl脚本中调用另一个perl脚本。 有很多种方式可以实现这个目的，这里我列出来3中常见的方式，并以一个例子说明这三种方式的不同之处。 1. 被调用的perl脚本 我们在一个perl脚本(取名为testSystemCall.pl)中调用另一个脚本（取名为printCallInfo.pl）。printCallInfo.pl中内容如下： #!/usr/bin/perl -w # usage: perl printCallInfo.pl number # number: an Integer use strict; use warnings; my $countNumber = $ARGV[0] or die "Need to input an integer on the command line\n"; print "This perl script is called $countNumber times\n"; 使用方法已经在脚本中说明，比如使用： perl printCallInfo.pl 5 屏幕上就会显示： This perl script is called 5 times 2. 调用脚本testSystemCall.pl 我们在脚本中分别查看使用以下三种方式调用printCallInfo.pl： system("command"); exec("command"); `command`; testSystemCall.pl脚本内容如下： #!/usr/bin/perl -w # usage: perl testSystemcall.pl number # number : an enum number # 1: use system("command") # 2: use exec("command") # 3: use `command`; use strict; use warnings; my $exceType = $ARGV[0] or die "Need to input an integer(1,2,3) on the command line\n"; print "Begin loop to invoke system call: \n"; for(my $i=1; $i<=5;$i++) { ($exceType == 1) and system("perl printCallInfo.pl $i"); ($exceType == 2) and exec("perl printCallInfo.pl $i"); ($exceType == 3) and `perl printCallInfo.pl $i`; } print "End loop.\n"; 这个脚本需要指定一个1或者2或者3的整数，指定1代表执行system("perl printCallInfo.pl $i")，指定2或者3以此类推。 这里注意or和and的使用，也可以分别使用||和&&代替。巧妙使用这种方式可以节省很多if else语句。 2.1 system("command") （推荐） 使用该命令将开启一个子进程执行引号中的命令，父进程将等待子进程结束并继续执行下面的代码。 使用命令： perl testSystemCall.pl 1 执行了system("perl printCallInfo.pl $i");，得到下面的结果： Begin loop to invoke system call: This perl script is called 1 times This perl script is called 2 times This perl script is called 3 times This perl script is called 4 times This perl script is called 5 times End loop. 结果在意料之中。 2.2 exec("command"); 效果同system命令类似，区别是不会开启子进程，而是取代父进程，因此执行完引号中的命令后进程即结束。一般和fork配合使用。 使用命令： perl testSystemCall.pl 2 执行了exec("perl printCallInfo…

BioPerl（三）：巧用BioPerl格式化fasta文件
type: item
date: 2015-12-28T16:05:00+00:00
description: Overview1. BioPerl格式化fasta序列2. 使用BioPerl去除fasta文件中长度过短的序列 Overview 在处理fasta格式序列的过程中，我们经常会发现得到的fasta格式并不是很标准，比如有一个fasta文件中有多条这样形式的序列： >gi|28898692|ref|NP_798297.1| hypothetical protein VP1918 [Vibrio parahaemolyticus RIMD 2210633]|1 MKKTTLMSAVVATLSLVGCQSTTGSSDAQPEQTSHISQAVYEVEFHAAQSFLSQASQLEQSFADFCLAPK NDVEPVQQQWHSTMLAWMALQGQERGPATALEQSWNVQFWPDKKNTTGRKMSALTKADKVWTVEEISTQS VTVQGLGALEWLLYDDASTLNTNSNVCASGVAIAENLHDKAQIIANSWAENPWKSLQKTEWESEYISLLS NQLEYSMKKLSRPLAKIGHPRPYFSESWRSETSLSNLKANLESLHQLYFANGKGLDALLRAQGKTQLADR 它的序列内容并不是一行，而是四行，尽管这是被允许的，但是有的时候出于一些目的，我们想要序列的内容是一行，而不是多行。 我自己写了一个脚本用来将每一行的换行符去掉，并保留最后一行的换行符，代码看起来很丑陋。既然BioPerl可以帮我们自动处理序列的很多信息，那是否也能帮我们格式化序列的内容，我抱着试试看的态度试了一下，真的可以... 1. BioPerl格式化fasta序列 其实复用了 BioPerl（二）：使用BioPerl读取fasta文件 中的脚本： #!/usr/bin/perl -w use strict; use warnings; use Bio::SeqIO; use Bio::Seq; my $catchseq_seqio_obj = Bio::SeqIO->new(-file=>"unFormatedFastaFile.fasta", -format=>'fasta'); # 在这儿处理每个序列的信息 while(my $seq_obj = $catchseq_seqio_obj->next_seq) { # ... my $seq = $seq_obj->seq; # ... # 重新拼成fasta格式 # 注意，$display_name中是不包含fasta的标识符>的，所以拼接时要手动加上> my $seqContent = ">".$display_name.$desc."\n".$seq."\n"; } # 省略了将 $seqContent重新写到文件.. 只需要使用BioPerl把不标准的Fasta格式文件读取到，再写到新的文件中就可以了，重写之后，格式为： >gi|28898692|ref|NP_798297.1| hypothetical protein VP1918 [Vibrio parahaemolyticus RIMD 2210633]|1 MKKTTLMSAVVATLSLVGCQSTTGSSDAQPEQTSHISQAVYEVEFHAAQSFLSQASQLEQSFADFCLAPKNDVEPVQQQWHSTMLAWMALQGQERGPATALEQSWNVQFWPDKKNTTGRKMSALTKADKVWTVEEISTQSVTVQGLGALEWLLYDDASTLNTNSNVCASGVAIAENLHDKAQIIANSWAENPWKSLQKTEWESEYISLLSNQLEYSMKKLSRPLAKIGHPRPYFSESWRSETSLSNLKANLESLHQLYFANGKGLDALLRAQGKTQLADR 可以看到序列中的换行符已经去除了。既然可以格式化序列内容，也可以顺便做点别的，比如读取一个fasta序列时，去除那些序列长度过小的序列，不然使用有些特征提取算法时会出现异常。 2. 使用BioPerl去除fasta文件中长度过短的序列 这里给出一个完整点的例子，写一个叫removeShortFastaEntries.pl，内容如下： #!/usr/bin/perl -w # usage: perl removeShortFastaEntries.pl original.fasta formatedEntries.fasta [50] use strict; use warnings; use Bio::SeqIO; use Bio::Seq; # 在命令行设置要处理的fasta文件名字 my $input_file = $ARGV[0] or die "Need to input fa…

BioPerl（二）：使用BioPerl读取fasta文件
type: item
date: 2015-12-28T14:59:00+00:00
description: Overview1. 使用BioPerl读取单条fasta序列2. 使用BioPerl读取多条fasta序列3.参考资料 Overview 在 BioPerl（一）：安装BioPerl 中我们不只安装了BioPerl，还给出了一个使用BioPerl的手动构造了一个Bio::Seq对象的例子，这个对象中包含了我们手动填入的fasta格式的信息。既然可以手动构造，那么也就可以从fasta文件中读取序列信息，由BioPerl自动填充成Bio::Seq对象。 1. 使用BioPerl读取单条fasta序列 我们有一个名字叫做singleEntry.fasta的文件，里面有一条序列内容： >gi|28898513|ref|NP_798118.1| hypothetical protein VP1739 [Vibrio parahaemolyticus RIMD 2210633]|1 MTSQKNIEEQDEVVVIEERDKRTHIYIAIAAVLGLAFGGLAGSVLTANKWESTYQVLEDKYQALAQDKTALVSQVKTREESLDKEIQEKVDALLAEKDAAHQKALKKLQTQLTEVEKVNLSLESQVKQQNDKLSSSKTENEKLTRQADMQATMFERSREVFQKELKISQDLEALEKEREKLLPKIDKLKKECDVFLEGKSWDVKSDACDKHDEANSRLSQIDQLIEVYKMDLKQIKEITSDMGL 这是一个标准的fasta格式的序列，一共有两行，第一行是序列的各种标识，第二行是序列内容，注意，整个序列是一行，只是因为序列太长显示不下，才会自动换行。 我们写了一个名叫readSingleFastaByBioPerl.pl的脚本，内容如下： #!/usr/bin/perl -w use strict; use warnings; # Bio::SeqIO类用来读取文件 use Bio::SeqIO; # Bio::Seq类用来存储fasta序列，一条fasta序列对应一个Bio::Seq对象 use Bio::Seq; # 读取fasta文件，文件名可以用单引号，也可以用双引号， # -format指定了文件的内容是fasta格式，注意这里的文件不一定是.fasta后缀名，只要内部序列是fasta格式就可以了，文件名可以是.txt或者.out等后缀。 my $catchseq_seqio_obj = Bio::SeqIO->new(-file=>"singleEntry.fasta", -format=>'fasta'); # Bio::SeqIO读取一个文件，会创建一个Bio::SeqIO对象，这里名字叫$catchseq_seqio_obj，有多少条序列，就会有多少个Bio::Seq对象 #下面这句取Bio::Seq对象的方法看起来像是一个典型的迭代器的遍历方法，只是我们这里只有一条序列，所以取一次就可以了。 my $seq_obj = $catchseq_seqio_obj->next_seq; # Bio::Seq对象($seq_obj)只能改包含了很多序列相关的属性，使用下面的方式取出来。 # 序列名字 my $display_name = $seq_obj->display_name; # 序列的描述 my $desc = $seq_obj->desc; # 序列字符串 my $seq = $seq_obj->seq; # 序列的类型（dna还是蛋白质？） my $seq_type = $seq_obj->alphabet; # 序列的长度 my $seq_length = $seq_obj->length; #使用双引号时，$display_name会显示为$display_name存储的内容，如果想显示$display_name这几个字符，需要使用\$display_name，去掉$的引用含义。 #使用单引号时，$display_name会显示为这几个字符本身 print "\$display_name:\n$display_name\n"; print "\$desc:\n$desc\n"; print "\$seq:\n$seq\n"; print "\$seq_type:\n$seq_type\n"; print "\$seq_length:\n$seq_length\n"; 运行脚本readSingleFastaByBioPerl.pl perl readSingleFastaByBioPerl.pl 显示如下： $display_name: gi|28898513|ref|NP_798118.1| $desc: hypothetical protei…

BioPerl（一）：安装BioPerl
type: item
date: 2015-12-26T12:08:00+00:00
description: Overview1. BioPerl的安装1.1 perl的版本1.2 CPAN是什么？1.3 升级CPAN1.4 安装/升级Module::Build，并设置为默认安装器1.5 安装expat库 （Optional）1.6 使用CPAN安装BioPerl1.7 运行一个例子 Overview 今天闲暇之余，看到了一篇关于BioPerl的博客 初品BioPerl（第三篇：从本地文件中获取fasta序列），发现BioPerl可以让很多事变得简单，fasta格式处理起来也事半功倍。 其实宋老师之前已经跟我提过BioPerl了，只不过我一直以任务为导向，觉得perl脚本就够处理，所以一直也没去了解。好东西自然马上就要用起来，我也马上装上了BioPerl，这里记录下来BioPerl的安装，以后有需要，就把BioPerl相关的东西持续写下去。 1. BioPerl的安装 直接查看BioPerl的文档 BioPerl Main Page，提供了从安装到快速入门等各种文档，这里我参考的是Installing BioPerl on Unix，实际上，无论你用的是Mac还是各种版本的Linux，都可以参考这个页面，因为这里提供了一种通用形式的安装方式：Installing using CPAN。 1.1 perl的版本 使用 perl -version 查看你系统中的perl版本号，我的系统中perl版本信息为： This is perl 5, version 16, subversion 3 (v5.16.3) built for darwin-thread-multi-2level Young说使用perl 6没办法安装BioPerl，可能是因为perl 6版本太新了，还没有对应的BioPerl模块，所以这里我们安装前要确保使用的perl版本号是perl 5。 1.2 CPAN是什么？ 百度百科关于CPAN的解释清晰明了： CPAN（Comprehensive Perl Archive Network）中译为“Perl综合典藏网”，“Perl综合档案网”或者“Perl程序库”。它包含了极多用Perl写成的软件和其文件。 CPAN亦是一支Perl程序的名字，其作用是让使用者容易从CPAN下载、安装、更新及管理其他在CPAN上的Perl程式。 CPAN的成功引来很多其他编程语言社群的模仿。CTAN和CRAN都参考了CPAN的命名方式。另外PEAR（PHP Extension and Application Repository）也是类似CPAN的PHP程式网站。 你也可以通过 CPAN官网 查看CPAN相关的各种信息，比如CPAN中的模块，CPAN的镜像等。 其实不止PHP，如果有使用R语言的经验，就会马上想起到R语言的程序库CRAN，当你使用R语言的install.packages函数去安装包时，实际上R语言就是去CRAN中找到这个包，然后下载下来并安装到你的本地环境中。 从CPAN安装BioPerl只需要几句命令就可以了，perl会自动把BioPerl放在指定的位置并配置到路径，完全不需要手动参与。 1.3 升级CPAN 既然CPAN是perl的在线程序库，那么CPAN中的内容就是一直不停更新的，所以安装一个perl库之前，先升级一下CPAN总是好的。 假设你的电脑上已经安装配置好了perl，使用下面的命令更新CPAN： perl -MCPAN -e shell 执行了这条命令，命令行就会进入CPAN的执行环境，等待你输入新的指令，输入 install Bundle::CPAN 执行CPAN升级，注意这句命令的名字是install，如果你本地还没有CPAN，那么就会下载配置最新的CPAN到本地，如果已经有了CPAN,那么更新到最新。 安装或者更新完CPAN之后，使用 q 退出CPAN的执行环境。 1.4 安装/升级Module::Build，并设置为默认安装器 使用 cpan 进入CPAN的执行环境，并依次输入下面几条指令： install Module::Build o conf prefer_installer MB o conf commit q 上面几条执行依次完成了安装，配置，提交配置，退出CPAN的执行环境。 1.5 安装expat库 （Optional） 其实我装BioPerl的时候并没有装这个库，而是在写这篇blog的时候才装，如果你需要处理xml文件，可能你需要安装expat库， 如果使用的是Ubuntu，可以直接使用下面的命令安装： sudo aptitude install libexpat-dev 如果使用的是别的linux系统或者mac，使用下面的方式： 使用wget下载expat库 wget http://sou…

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请求和解析所需要的模块…