科学网

 找回密码
  注册
科学网 标签 Perl 相关日志

tag 标签: Perl

相关日志

合并文件的VB及Perl小程序
热度 1 cambaluc 2018-1-24 17:17
在数据处理或批量文件处理中,常有对多个小文件合并到一个大文件中的需求,以下是两段小程序,记录在此以备用。 这是我用 VB 写的程序,电脑上没有编程软件时可用 Excel ,在 Excel 的“宏”模块写下如下代码来执行,实现把某文件夹下的所有文本文件合并到一个 aaa3.txt 文件中,具体文件夹或输出格式可照程序修改: Sub Macro1() Dim fso, fd, fi, ffs Dim FileNumber, i, j As Integer Dim Mystring, strSortFile() As String FileCount = 0 FileNumber = FreeFile Set fso =CreateObject(Scripting.filesystemobject) Set fd =fso.getfolder(E:\\prg_python\\temp) Set ffs = fd.Files For Each fi In ffs FileCount = FileCount + 1 Next If FileCount = 0 Then GoTo ErrPrc Dim Aaa As String ReDim strSortFile(0 To FileCount) For Each fi In ffs Aaa = fi.Name If Aaa strSortFile(i) Then strSortFile(i + 1) = Aaa Else j = i Do strSortFile(j + 1) =strSortFile(j) j = j - 1 Loop Until Aaa = strSortFile(j) strSortFile(j + 1) = Aaa End If i = i + 1 Next j = 1 OpenE:\\prg_python\\temp\\aaa3.txt For Output As #5 For i = 1 To FileCount Open fd \\ strSortFile(i) For Input As FileNumber Print #5, __________________ Print #5, strSortFile(i) Print #5, ______________ While Not EOF(FileNumber) Line Input #FileNumber, Mystring Print #5, Mystring Wend Close #FileNumber j= j + 1 Next i Close #5 Exit Sub ErrPrc: MsgBox File Error Chr(10) Select CorrectFile Directory , , ERROR End Sub 以下是用 Perl 来实现同样的功能,把文件某文件夹下 .py 文件合并到 kang02.txt 中,程序相对就短一点了。 $aa=E:\\\\prg_python; chdir $aa; @FILES=`dir *.py/b`; my $fff; open(F_ALL,kang02.txt); for($j=0;$j@FILES;$j++){ $fff=$FILES ; chomp($fff); print F_ALL#============.$fff.=========.$j.====\\n; open(F_PL,$fff) or diecannot open\\n; while($line=F_PL){ print F_ALL $line; } close(F_PL); } close(F_ALL); print \\n;
个人分类: VB|3502 次阅读|1 个评论
perl的更新与模块的安装
luria 2017-7-26 12:56
perl 更新 有很多生信软件用 perl 语言来写,而且会用到一些 perl 模块。编程语言的模块一直被认为是把 双刃 剑,弊端 之一是有些模块的安装比较麻烦。闲言少述,这里提供了 perl 的更新代码(跳过多线程的坑)以及基本的 perl 模块安装方法。 我们在安装 perl 软件的时候经常会遇到 “This Perl not built to support threads” 这样的错误提示。一直不太明白在多线程软件逐渐形成主流的今天, perl 却从 5.8.0 版之后,默认安装均不启用多线程,这真是一个巨大的坑! 安装多线程版的 perl 如下: wget http://www.cpan.org/src/5.0/perl-5.16.1.tar.gz tar -xzf perl-5.16.1.tar.gz cd perl-5.16.1 ./Configure -des -Dprefix=/usr/local/perl -Dusethreads -Uinstalluserbinperl make make test make install mv /usr/bin/perl /usr/bin/perl.bak ln -s /usr/local/perl/bin/perl /usr/bin/perl # 运行完如果输入 perl -v 能正常显示,则表示安装成功 # ./Configure 这一行参考自 ,其中各选项解释如下(可通过 ./Configure -h 查看): -des 即 -d -e -s 的合写。其中 -d 表示未指定的选项均按默认值, -e 表示执行 config.sh 过程中不显示出现的警告, -s 表示静默安装,仅打印出错误信息或必要信息。 -Dusethreads 支持多线程( use thread support ), -Dprefix=/opt/perl5 指定 perl 安装位置( choose your destination ),默认是安装到 /opt/perl5 中,这里通常的做法先安装到 /usr/local/ ,再将 perl 主程序链接到 /usr/bin/ 中。考虑到安装可能发生意外,或者某些软件需要使用低版本的 perl 运行,建议备份原始的 perl ,再将新的 perl 并设为默认,而不是直接覆盖。 - Uinstalluserbinperl 表示在安装的时候不要用新的 perl 直接覆盖 /usr/bin/perl ( You'll also need to tell Configure not to link this new Perl as /usr/bin/perl with -Uinstallusrbinperl ) 另外,看到博文 中,还有一个选项 -Dcc=gcc 它指定使用的编译器( choose your compiler ),因为默认值即为 gcc ,这个选项没有必要加。 perl 模块安装 A.使用cpan安装 一些用 Perl 写的软件安装时经常出现某模块没有安装,如下: 从提示中我们发现是 Archive::Extract 这个模块没有安装。 安装的方法如下: sudo cpan Archive::Extract # 新版的cpan不需要用cpan install module, 只需cpan module 此外还有 perl -MCPAN -e install install Archive::Extract # 注意引号 B.使用原码安装 搜索 perl 模块的重要网址: http://search.cpan.org/ https://metacpan.org/ 从以上提供perl模块的网站下载模块的压缩包,以XML:Simple为例(参考〔3〕。 这个模块会在trinity下游分析的软件中用到)。 在CPAN中搜索到 http://search.cpan.org/~grantm/XML-Simple-2.24/lib/XML/Simple.pm 。在页面右侧会有一个 Download链接,通过该链接下载到tar.gz压缩包(XML-Simple-2.24.tar.gz)。 tar -zxvf XML-Simple-2.24.tar.gz cd XML-Simple-2.24 perl Makefile.PL make make test make install 以下网址也提供了一些perl的学习材料 http://perldoc.perl.org/index.html 参考材料 https://www.perl.com/pub/2002/09/04/threads.html http://blog.csdn.net/zzq900503/article/details/16948349 http://www.mclean.net.nz/cpan/
个人分类: BioIT|9556 次阅读|0 个评论
生信人写程序2. Editplus添加Perl, Shell, R模板和语法高亮
woodcorpse 2017-7-4 15:28
科学网对Markdown排版支持较差,对格式不满意的用户请跳转至 CSDN 或 “生信宝典”公众号 阅读; 想了解更多宏基因组、16S分析相关文章,快关注“宏基因组”公众号,干货第一时间推送。 系统学习生物信息,快关注“生信宝典”,那里有几千志同道合的小伙伴一起学习。 前言 “工欲善其事必先利其器”,生信工程师每天写代码、搭流程,而且要使用至少三门编程语言,没有个好集成开发环境(IDE,Integrated Development Environment)那怎么行? 本人使用过vim, editplus, ultraedit, notepad++, sublime。感觉在多语言支持、直接远程编辑脚本、启动速度等方面还是editplus用着比较舒服,适合我的个人习惯。 Editplus 下载和安装 最好官网下载最新版4.3,喜欢的话正版才30$,关键是不注册也不影响使用。 https://www.editplus.com/download.html 有32/64位版,建议安装64位版 epp430_64bit.exe ,还有中文版(不建议,全是老版本),英语拼写检查(安装了没看到效果); 先安装完成后,打开,会出现配置设置、语法文件位置选择,如下图 建议修改到自己的目录,方便管理和备份,如改为C:\Users\woodc\Desktop\home\soft\editplus 如果不想看到试用字样,百度可以找到很多注册机/注册码,很容易激活。 添加Perl语言模板 该程序对Perl语法默认支持已经非常好了,只是缺少个生信专用模板,参考我的上篇文章 生信人写程序1. Perl语言模板及配置 右键另存下载perl模板文件 直接单击可能会报错,因为Perl的pl文件是也属于网页的一种,会被运行,而内容又不是网页,所以报错。 主要操作如下:将《Perl语言模板》原文中代码复制到editplus中新建的空白文件,点保存; 第一种情况:如果刚才设置了新的模板目录,请选择你自己设置的目录,替换template.pl。 第二种情况:没有更改配件文件目录,默认的保存位置可替换template.pl即可。 如果下次使用新建Perl不能自动加载模板,可以尝试将模板代码保存为template.pl在任何位置,选择Tools - Preference - template — Perl,更改template.pl文件位置为刚才保存的模板template.pl文件即可。 以后点新建- perl会自己加载我们配置的模板开使写新程序;其实我们更多是找写过相近的程序再修改,这个过程是逐渐积累的,领域和用途不同,自己的常用功能也是很个性化的。 添加Shell语言支持 https://www.editplus.com/others.html 选择* Shell stx - 肖俊斌 (2011-06-21)下载,解压后有shell.stx语法文件放在之前设置的目录;也可 直接右键点我下载shell语法 再选择 Tools — Preference — Setting syntax, Add - 输入 “Shell” — OK, 文件扩展添”sh”,语法文件选择下载的shell.stx;点OK; Shell写作模板 主要包括命令行参数解析、默认参数设置、程序功能描述及帮助文档等 右键另存下载Shell模板文件 #!/bin/bash set -e # 设置程序参数的缺省值,少用参数即可运行 # Default parameter input=input.txt output=output.txt database=database.txt execute='TRUE' # 程序功能描述,每次必改程序名、版本、时间等;版本更新要记录清楚,一般可用-h/-?来显示这部分 # Function for script description and usage usage() { cat EOF 2 Usage: ------------------------------------------------------------------------------- Filename: template.sh Revision: 1.0 Date: 2017/6/24 Author: Yong-Xin Liu Email: yxliu@genetics.ac.cn Website: http://bailab.genetics.ac.cn/ Description: This script is solve parameter read and default Notes: Function of this script ------------------------------------------------------------------------------- Copyright: 2017 (c) Yong-Xin Liu License: GPL This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. If any changes are made to this script, please mail me a copy of the changes ------------------------------------------------------------------------------- Version 1.0 2017/6/24 # 输入输出文件格式和示例,非常有用,不知道格式怎么准备文件呀 # Input files: input.txt, can inclue many file # 1. input.txt, design of expriment SampleIDBarcodeSequencegroupgenebatchdescription WT.1TAGCTTWTggps9.102double mutant of ggps9-ggps10, cause A/B down WT.2GGCTACWTggps9.102double mutant of ggps9-ggps10, cause A/B down WT.3CGCGCGWTggps9.102double mutant of ggps9-ggps10, cause A/B down # 2. database.txt, annotation of gene IDdescription AT3G48300Transcript factor # Output file 1. Annotated samples DE genes SamplesIDdescription WtAT3G48300Transcript factor 2. Volcano plot: vol_otu_SampleAvsSampleB.pdf # 参数描述,写清功能的缺省值 OPTIONS: -d database file, default database.txt -i input file, recommend must give -o output file or output directory, default output.txt -h/? show help of script Example: template.sh -i input.txt -d database.txt -o result.txt EOF } # 解释命令行参数,是不是很面熟,其实是调用了perl语言的getopts包, # Analysis parameter while getopts d:h:i:o: OPTION do case $OPTION in d) database=$OPTARG ;; h) usage exit 1 ;; i) input=$OPTARG ;; o) output=$OPTARG ;; ?) usage exit 1 ;; esac done 将以上代码保存为template.sh,点击Tools — Preference — Template — Add 命名为Shell,选择template.sh文件,OK。 以后点New file, 选择shell即自动加载模板; R语言的语法支持 官网下载* R programming language stx - Wei Wang (2007-05-15),或 点我下载R语法文件 Tools — Preference — Setting syntax, Add - 输入 “R” — OK, 文件扩展添”r,R,Rmd”,语法文件选择下载r的stx;点OK; 现在打开个R文件试试,已经语法高亮了 如果有Rstudio server的小伙伴,建议直接用网页版Rstudio在服务器上调式; 远程编辑脚本 先添加远程打开和保存工具栏按钮 Tools - Preference - Tools bar ; 把左侧的Open Remote, Save as Remote 选中按右箭头添加右侧;再选择edit菜单的Line Comment, Line Uncoment添加右侧;把右侧的远程打开和保存托至顶部,常用在前面好找;点OK确定配置 连接服务器打开文件编辑 点Open Remote按扭,点Setting设置远程服务器信息,添加服务器名称、IP、账号和密码,再点Advance中选择Encryption为sftp,OK再OK;即可正常连接服务器并浏览文件,我们选择编码Encoding为UTF-8,再打开shell脚本; 编辑吧,保存自动为远程保存,可以随时保存后马上运行调试,非常方便; 下次再打开已经使用过的文件,记得文件-最近打开文件选择更方便。
个人分类: 编程|4619 次阅读|0 个评论
生信人写程序1. Perl语言模板及配置
woodcorpse 2017-6-24 18:38
科学网对Markdown排版支持较差,对格式不满意的用户请跳转至 CSDN 或 微信 阅读; 如果感觉文章对您有帮助,想继续阅读同类文章,请扫描下方二维码关注“生信宝典”公众号,每天接收最新生物信息学原创文章。只关注宏基因方向的用户请微信搜索“宏基因组”公众号添加。 生物信息领域常用语言 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python/Java..(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准。 生物信息常用语言非常广泛,我常用的有Perl, R, Shell,此外参与网页制作还用过PhP+mySQL,写博客用Markdown。这些其实都是非常小众的语言,如果和计算机专业的人交流,对方可能没听过这些语言。本系列“生信人写程序”主要以Perl为主,并伴随一些零星的R和Shell编程的经验和技巧。对于生信Perl使用人员有个交流和互相提高的平台,让新人少走点弯路。对于没有任何Perl基础强例建议别入坑,想学生信找Python教程吧,不解释看下图。 TIOBE世界编程语言使用排行 我们可以看到世界前三是Java, C, C++,大家都听说过;第四是Python,目前在生领领域有取代Perl地位的趋势,目前Perl列第9(世界十大语言之一)下降一位。R语言的数据分析领域有应用越来越广泛,今年上升两位至14名;Shell由于版本和各类较多,在50-100名间有4种,此语言只建议快速解决小问题,不建议写太长的任务,很容易跨平台不兼容。 总结: 生信常用语言:Shell+R+Python/Perl 世界三大语言:Java, C, C++ 生信语言的排名:Python 4th, Perl 9th, R 16th Perl写作环境模板推荐 很多人三行两行或直接命令行用perl直接解决问题,虽然快,但是不容重用和别人使用。因此,良好的写作环境和模板是效率和专业的体现,即提高自己的代码重用性,也方便交流和他人使用。 编程环境IDE 推荐使用:Editplus 4.0,网上到处都是注册机和序列号,随便用,下载址搜不到可以点链接: http://pan.baidu.com/s/1jHJJ1qe 密码:6xm6。优点是可配置模板,可直接编辑服务器脚本(省略上传步骤),高效的代码调试。 编程模板 是解决常用功能的写作模板,如帮助文档部分(提高代码重用和版本管理,方便其他人使用),命令行参数管理(可读性的命令行是程序的基础),程序运行时间统计(项目时间管理),常用文件读取数据结构样式(方便修改文件输入和输出)等; 下面是实现这样功能的模板: #!/usr/bin/perl -w # 加载时间管理,参数管理,文件名和路径处理的基础包,无须安装 use POSIX qw(strftime) ; use Getopt::Std; use File::Basename; ############################################################################### #命令行参数据的定义和获取,记录程序初始时间,设置参数默认值 #Get the parameter and provide the usage. ############################################################################### my %opts ; getopts( 'i:o:d:h:' , \ %opts ); usage unless ( exists $opts {i} exists $opts {o} ); my $start_time = time ; print strftime( Start time is %Y - %m - %d %H : %M : %S \n , localtime ( time )); print Input file is $opts {i}\nOutput file is $opts {o}\n ; print Database file is $opts {d}\n if defined ( $opts {d} ); $opts {h} = 1 unless defined ( $opts {h} ); ############################################################################### #读入的数据或注释文件,用于与输入文件比较或注释(可选),提供三种方式 #Read the database in memory(opt) ############################################################################### #open DATABASE,$opts{d}; # 1. 散列结构数据库,要求数据文件有唯一ID并且无顺序要求 #my %database; #database in hash #while (DATABASE) { #chomp; #my @tmp=split/\t/; #$database{$tmp }=$tmp ; #} # 2. 数组结构数据库,无唯一ID,但有顺序要求 #my (@tmp1,@tmp2); #database in array #while (DATABASE) { #chomp; #my @tmp=split/\t/; #push @tmp1,$tmp ; #push @tmp2,@tmp ; #} #close DATABASE; # 3. 批量数据文件,读取一批有相似结构的文件 #open a list file #my %list; #my @filelist=glob $opts{i}; #foreach $file(@filelist){ #open DATABASE,$file; #$file=basename($file); #while (DATABASE) { #my @tmp=split/\t/; #$list{$file}{nr}++; #} #close DATABASE; #} ############################################################################### #Main text. ############################################################################### # 正文部分,读取输入文件,列出输入和输入文件的三行作为示例,方便编程处理数据 open INPUT, $opts {i} ; #chrm0 snppos1 ref2 mat_gtyp3 pat_gtyp4 c_gtyp5 phase6 mat_all7 pat_all8 cA9 cC10 cG11 cT12 winning SymCls SymPval BindingSite cnv #1 4648 C A C M PHASED C A 0 11 0 0 M Asym 0.0009765625 -1 0.902113 open OUTPUT, $opts {o} ; #chrm snppos ref mat_gtyp pat_gtyp c_gtyp phase mat_all pat_all cA cC cG cT winning SymCls SymPval BindingSite cnv #1 4648 C A C M PHASED C A 0 11 0 0 M Asym 0.0009765625 -1 0.902113 my %count ; # h参数用于去除有文件头的行 while ( $opts {h} 0 ) { #filter header INPUT; $opts {h} --; } # 输入和输入处理部分,常用按行读取处理并输入,默认按tab分割数据 while (INPUT) { chomp ; my @tmp = split /\t/ ; print OUTPUT $tmp \t $tmp \n ; } close INPUT; close OUTPUT; ############################################################################### #Record the program running time! # 输出程序运行时间 ############################################################################### my $duration_time = time - $start_time ; print strftime( End time is %Y - %m - %d %H : %M : %S \n , localtime ( time )); print This compute totally consumed $duration_time s\.\n ; ############################################################################### #Scripts usage and about. # 程序的帮助文档,良好的描述是程序重用和共享的基础,也是程序升级和更新的前提 ############################################################################### sub usage { die ( qq! Usage: template.pl -i inpute_file -o output_file -d database -h header num Function: Template for Perl Command: -i inpute file name (Must) -o output file name (Must) -d database file name -h header line number, default 0 Author: Liu Yong-Xin, liuyongxin_bio\ @163 .com, QQ: 42789409 Version: v1. 0 Update: 2017 / 6 / 2 Notes: \n! ) } 模板导入Editplus 将上述代码保存为template.pl,在editplus中选择Tools — Preference — Template — Perl,点击template.pl右边的..按键,选择你自己的template.pl即可,以后选择perl脚本会自己加载该模板。 希望对大家有帮助!
个人分类: 编程|3296 次阅读|0 个评论
Perl: check if Perl is installed in your computer
haibaraxx 2016-12-21 02:30
# Check the Perl version installed In the terminal, type in: $ perl -v This is perl 5, version 24, subversion 0 (v5.24.0) built for darwin-thread-multi-2level Copyright 1987-2016, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using man perl or perldoc perl. If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. # Summary of Perl configuration $ perl -V Summary of my perl5 (revision 5 version 24 subversion 0) configuration: Platform: ... Compiler: ... Linker and Libraries: ... Dynamic Linking: ... Characteristics of this binary (from libperl): Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE PERL_DONT_CREATE_GVSV PERL_HASH_FUNC_ONE_AT_A_TIME_HARD PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP PERL_PRESERVE_IVUV PERL_USE_SAFE_PUTENV USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API Built under darwin Compiled at May 11 2016 09:17:03 @INC: /opt/local/lib/perl5/site_perl/5.24/darwin-thread-multi-2level /opt/local/lib/perl5/site_perl/5.24 /opt/local/lib/perl5/vendor_perl/5.24/darwin-thread-multi-2level /opt/local/lib/perl5/vendor_perl/5.24 /opt/local/lib/perl5/5.24/darwin-thread-multi-2level /opt/local/lib/perl5/5.24
个人分类: Perl|1840 次阅读|0 个评论
centos的perl GD 画图环境配置
hsm 2015-10-9 15:09
首先,安装GD作图库。yum install gd* 其次,安装perl的GD模块, http://search.cpan.org/~lds/GD-2.35/GD.pm
个人分类: 生物信息|3677 次阅读|0 个评论
Perl学习(2015年8月5日)
wjd2014 2015-8-5 13:28
pop和push操作符: pop 负责取出数组中最后一个元素并将其作为返回值返回。 push 用于添加一个元素到数组的尾端 代码: shift和unshift操作符: shift和unshift是对数组的“开头”进行相应的处理 代码: splice操作符: 第一个参数表示要操作的目标数组 第二个参数表示要操作的一组元素的开始位置 第三个参数表示指定要操作的元素长度 第四个参数表示要替换的列表 代码: 如果不删除元素,只是添加,将第三个参数设置为0即可。 字符串中的数组内插 :
个人分类: Perl学习|8 次阅读|0 个评论
Perl学习(2015年8月4日)
wjd2014 2015-8-4 15:00
第三章:列表与数组 列表 指的是标量的有序集合,而 数组 则是存储列表的变量。 访问数组中的元素: 数组中的元素是以连续的整数来编号,从0开始,之后依次加1,如: $fred =wu; # 数组fred的第一个元素是wu $fred =jia; #数组fred的第二个元素是jia $fred{2] = dong; #数组fred的第三个元素是dong 代码; 起初自己犯了一个错误是没有先定义数组,导致运行失败。 特殊数组索引: 最后一个元素 的索引值是 $#rocks 代码: qw简写: qw表示 加上引号的单词,perl会将其当成 单引号内的字符串来处理 ,所以在qw构建的列表中,不能像双引号内的字符串一样使用\n或$fred。其中的 空白符都会被抛弃 ,然后剩下的就是列表元素。 参考书籍:Perl语言入门
个人分类: Perl学习|4 次阅读|0 个评论
[转载]perl---(数组和哈希)引用
ginkgo0622 2015-6-29 19:16
转自 http://www.chinaunix.net/old_jh/25/504623.html *名称 *描述 *谁需要复杂的数据结构? *解决办法 *语法 ;创建应引用 创建规则 1 ;使用引用 使用规则1 使用规则2 ;一个例子 ;箭头符号规则 解决方法 其他集锦 摘要 感谢 ;发布要求 -------------------------------------------------------------------------------- 名称 perlreftut - Mark的一个简单的'引用'教程 -------------------------------------------------------------------------------- 描述 在perl5中,一个重要的功能是提供了处理复杂数据类型的能力,比如多纬数组和嵌套的哈希。为了实现这个,perl5引入了一个要素-'引用',并使用引用来处理perl中复杂的、结构化的数据。 不幸的是,这里有大量的有趣的语法需要学习,但手册却很难理解。手册描述的相当完整,但是有时候人们却发现一个问题,它不能告诉人们那些是重要的,那些是不重要的。 幸运地是,你只需要了解手册上10%的知识得到90%的好处。本文就是告诉你其中的10%。 -------------------------------------------------------------------------------- 谁需要复杂的数据结构? 始终伴随着Perl 4的一个问题是怎么样来描述一个值是列表的哈希表。Perl 4 有哈希但是它的值必须是标量,不能是列表。 你为什么需要一个列表的哈希结构呢?让我们来看一个简单的例子:你有一个包含城市和国家名称的文件,如下: Chicago, USA Frankfurt, Germany Berlin, Germany Washington, USA Helsinki, Finland New York, USA 你想按照下面的格式输出,每一个国家出现一次,然后是一个按照字母顺序的该国家内城市的列表,如下: Finland: Helsinki. Germany: Berlin, Frankfurt. USA: Chicago, New York, Washington. 一个很自然的解决方法是将国家的名称设置为一个哈希结构的键,和国家名称对应的健值是这些国家内的城市的一个数组。 每一次,你读取一行输入,将其分成国家和城市两个数据。查看'国家名称'的键所对应的城市列表,然后把新的城市加入那个列表中。当你完成了整个输入,然后将整个哈希中每个健对应的健值-城市名的列表作一个排序,然后打印出来。 如果哈希值不能是列表,你就无法完成工作了。在Perl 4中,哈希的值不能是列表。它们只能是字符串。所以你必须把所有的城市名合并成一个字符串。当需要输出时,你再把这个字符串分拆成一个列表,然后对列表排序,最后将列表中的数据转成字符串输出。这样做非常烦琐并容易出错。而且让人沮丧的是,Perl已经拥有的优秀的列表功能无法使用了。 -------------------------------------------------------------------------------- 解决方法 当Perl进化到Perl 5时,我们必须考虑到哈希原来的设计:哈希的键值必须是标量。解决办法就是采用'引用'。 一个'引用'就是一个指向一个完整列表或完整哈希(或指向其他的东西,比如函数)的标量值。名字就是你比较熟悉的一种'引用'。 考虑一下美国的总统:一包杂乱的血肉。但是当我们谈到它,或者需要在计算机程序中描述它,你需要的只是一个简单的标量'George Bush'。 Perl中的'引用'就像列表和哈希的名字。它们是Perl中私有的,内部的名字,所以你可以确信它们是明确的,不像'George Bush', 一个'引用'只指向一个东西。你总是可以知道它指向什么。如果你有一个指向数组的'引用',你可以从它恢复出整个数组。如果你有一个指向哈希的'引用',你可以根据它恢复出整个哈希。但是这个'引用'仍旧是一个简单、紧凑的标量。 你不能使用一个健值是数组的哈希;哈希的健值必须是标量。我们被这个束缚住了。但是一个简单的'引用'能指向一个完整的数组,'引用'是标量,所以你可以使用指向数组的'引用'组成的哈希,它就像一个数组的哈希一样,和数据的哈希一样有用。 稍后我们会再回到这个‘城市-国家’的问题来。我们先来看一些操作'引用'的语法。 -------------------------------------------------------------------------------- 语法 创建'引用'仅有两种方法,使用它也是两种。 创建引用 创建规则 1 如果你在一个变量前加一个'\'号,你就得到了这个变量的'引用'。 $aref = \@array; # $aref 保存着指向@array的'引用' $href = \%hash; # $href 保存着指向%hash的'引用' 当你把'引用'保存在类似 $aref 或 $href的变量中,你就可以象操作其他标量一样copy或保存它。 $xy = $aref; # $xy 现在保存了指向 @array 的'引用' $p = $href; # $p 现在保存了指向 %hash 的'引用' $z = $p ; # $z 现在保存了指向 %hash 的'引用' 这些例子展示了如何创建命名变量的'引用',但是有时候,我们创建的数组或哈希没有名字。这个和你使用没有放到变量中去的字符串'\n'或数字'80'类似。 创建规则 2 创建了一个新的、匿名的数组,并返回一个指向这个数组的'引用'。 { ITEMS } 创建了一个新的、匿名的哈希,并返回那个哈希的一个'引用'。 $aref = ; # $aref 保存了这个数组的'引用' $href = { APR =; 4, AUG =; 8 }; # $href 保存了这个哈希的'引用' 从规则 2 中得到的'引用'和从规则 1 中得到的'引用'是同一种类型的: # 这里: $aref = ; # 和上面一样: @array = (1, 2, 3); $aref = \@array; 前面一种方法是后面两行的缩写,除了第一种方法没有创建一个多余的数组变量@array。 如果你只是编写符号 ${$aref} 数组中的一个成员 $a = 17; ${$aref} = 17 对一个成员赋值 上面每行中,两个表达式实现的是同一种功能。左边那个是对数组@a操作,右边那个是对'引用'$aref所指向的数组操作。它们对数组产生相同的作用。 使用哈希的'引用'和数组的'引用'完全一样。 %h %{$href} 一个哈希 keys %h keys %{$href} 从哈希中将键取出来 $h{'red'} ${$href}{'red'} 哈希中的一个成员 $h{'red'} = 17 ${$href}{'red'} = 17 对一个成员赋值 你对一个'引用'无论想做什么,使用规则 1 已经告诉你怎么做了。 你只要象使用常规的数组或哈希一样编写Perl代码,然后把数组或哈希的名字用 {$reference}来替代。‘当我只有一个'引用'时,怎么来遍历整个数组?’你这样写: for my $element (@array) { ... } 接着用'引用'替代数组名@array: for my $element (@{$aref}) { ... } ‘怎当我只有一个'引用'时,怎么来打印一个哈希的内容?’先写一个打印整个哈希的代码: for my $key (keys %hash) { print $key =; $hash{$key}\n; } 然后用'引用'代替那个哈希的名字: for my $key (keys %{$href}) { print $key =; ${$href}{$key}\n; } 使用规则 2 使用规则 1 是你真正需要的,因为它告诉了你怎么来处理一个'引用',而它对几乎任何的'引用'都有效。但是我们通常做的事情只是和数组或哈希中的一个成员有关,使用规则 1 却是很笨重的方法,所以还有简单的方法。 ${$aref} 太难阅读,所以我们这样写 $aref-; 。 ${$href}{red} 写的太笨重, 所以我们这样写 $href-;{red}。 如果 $aref 保存的是一个数组的'引用',那么 $aref-; 就是这个数组的第四个成员。不要和 $aref 相混淆,这个代表的是一个完全不同的数组的第四个成员,这个迷惑的数组是@aref。 变量 $aref 和 @aref 是完全不相关的,就像 $item 和 @item 一样。 同样的, $href-;{'red'} 是哈希'引用' 的变量$href的一部分,甚至这是一个没有名字的哈希。而$href{'red'} 是另一个容易混淆的命名哈希 %href 的一部分。很容易忘记写上符号' -;',如果出现这种情况,当你的程序从一个你不想取数据的数组和哈希中取出了成员,你会得到奇怪的计算结果。 例子 让我们来看一个例子: 首先,记住 创建了一个匿名数组,包含了 (1, 2, 3),然后返回一个数组的'引用'。 现在想一下: @a = ( , , ); @a 是一个拥有三个成员的数组,每一个成员是另一个数组的'引用'。 $a 是其中的一个'引用'。它指向一个数组,这个数组包含了(4, 5, 6),因为这是一个数组的'引用',使用规则 2 告诉我们可以这样写 $a -; ,用来取得这个数组的第三个成员。 $a -; 值是6。 同样的,$a -; 值是 2。这里我们就像在使用一个二维数组;你可以是用 $a -; 来取得或设置数组中任何一行任何一列中的成员。 这些符号看起来还是有些麻烦,所以还有更加简单的用法: 箭头符号规则 在两个下标之间的箭头是可选的。 我们可以用这个写法$a 来代替$a -; ;它们是相同的。相对于$a -; = 23,我们这样写$a = 23;它们也是相同的。 现在它们看起来真的象二维数组了! 你可以发现为什么箭头这么重要。没有它们,我们必须这样写${$a } ,而不是$a 。对于三维数组,它们使我们可以简单地写成$x 而不是写成难读的${${$x } } 方式。 -------------------------------------------------------------------------------- 解决办法 下面是前面提出来的问题的解决方法,就是关于城市和国家名称的重新格式化。 1 my %table; 2 while (;) { 3 chomp; 4 my ($city, $country) = split /, /; 5 $table{$country} = unless exists $table{$country}; 6 push @{$table{$country}}, $city; 7 } 第 2-4 行获取城市和国家的名称。第5行查看这个国家名称是不是已经作为一个键存放在哈希里面了,如果没有,程序就使用符号 unless exists $table{$country}; 6 push @{$table{$country}}, $city; 7 } 如果在哈希 %table 中已经有这个国家名 $country的记录,那么,加不加第5行没有任何区别。第6行会自己定位到$table{$country}这个'引用'指向的数组,把值 $city 放到数组中去。但是如果在%table中没有那个键,比如Greece,那么它会怎么办呢? 这是Perl,它会自己准确地完成工作。你想把一个Athens赋值给一个不存在地数组,那么Perl会帮助你创建一个新的、空的匿名数组,将它放到哈希%table里面去,然后把值 Athens 放到这个数组中。这个被称为'自动生成' --让事物自己自动产生出来。 Perl 发现在哈希里面没有这个键,就自动地创建了一个新的哈希记录。 Perl 发现你想要使用数组作为哈希的健值,它就自动创建一个匿名的空数组,并将指向这个数组的'引用'放到那个哈希中去。一般, Perl 创建的数组只有一个成员大小,用于保存这个新的城市名。 -------------------------------------------------------------------------------- 其他集锦 我承诺以10%的细节来使你得到90%的好处,那就意味着我跳过了90%的知识的细节。现在来看一下其中的重要的部分,这个比阅读手册 the perlref manpage 要容易得多,手册讨论了100%的细节。 手册 the perlref manpage中的一些集锦: 你可以对任何东西创建'引用',包括标量,函数和其他的引用。 在 使用规则 1 中,当大括号里面是一个象$aref这样的标量变量时,你可以省略掉这个大括号。例如, @$aref 和 @{$aref}是一样的,$$aref 和 ${$aref} 是一样的。 如果你是初学者,建议你还是养成加上大括号的习惯。 下面的操作不会copy '引用'指向的数组: $aref2 = $aref1; 你将得到两个'引用',它们都指向同一个数组。如果你修改了$aref1-; 的值,那么你查看变量$aref2-; 时,它也相应地变了。 要copy这个数组,你需要这样 $aref2 = ; 使用符号 来创建一个新的匿名数组, 而且这个新的数组的'引用'被赋值给了$aref2 。 这个新的数组用'引用'$aref1所指向的数组的内容来初始化。 同样的,要copy一个匿名哈希,你需要这样 $href2 = {%{$href1}}; 如果要判断一个变量保存的内容是不是'引用',使用函数ref 。如果它的参数是'引用',返回的值是'真'。实际上,它做得更好:如果是一个哈希的引用,它返回'HASH',如果是一个数组的引用,那么就返回'ARRAY'。 如果你想像字符串一样使用'引用'的话,你得到的字符串就像 ARRAY(0x80f5dec) or HASH(0x826afc0) 如果看到一个像这样的字符串,你应该知道你错误地输出了一个'引用'。 这种显示方式的另一个作用是你可以用eq来比较两个'引用',看它们是不是指向相同的东西。(你通常可以使用 == 来比较,因为它更会) 你可以像使用'引用'一样来使用一个字符串。如果你使用foo作为一个数组的'引用',它就是指向数组 @foo的一个引用。这被称为'软引用'或‘符号引用 '。 使用申明 use strict 'refs' 可以取消这个功能,如果你不小心使用了它,会导致各种可能的错误。 你可能更喜欢查看 the perllol manpage,而不是手册 the perlref manpage;它详细地讨论了列表的列表和多纬数组。然后,你可以继续学习手册 the perldsc manpage;它是数据结构的Cookbook, 它提供了处理哈希的数组,数组的哈希,以及其他数据结构的方法。
个人分类: perl|1799 次阅读|0 个评论
Perl复制图片并重命名
QuanXu 2014-10-11 21:03
文件及文件夹: template.png 模板文件 names.list 最终需要的全部文件名列表 finalFiles 空文件夹,用于存放最终产生的文件 Perl脚本内容 #!usr/bin/perl =pod author:Quan Xu date:2014.10.11 =cut use File::Copy; open IN, names.list; @names = IN; close IN; foreach \$name(@names){ chomp \$name; copy( template.png, finalFiles/\$name.png ) or die Copy failed: \$!; } #---End of program---
个人分类: 技术笔记|2066 次阅读|0 个评论
青春的回忆,向Perl致敬(一)
zhenyisong 2014-8-22 09:54
Perl 作为一种计算机语言,早在 1987 年由美国人 LarryWall 创建。这段历史以及 Larry 的个人自传都可以从维基百科得到。随后的阶段,荷兰人 Rossum ( 1989 )创建了 Python 。加拿大人 Gosling ( 1990 )创建了 Java 。日本人松本行弘( 1995 )年创建 Ruby 。丹麦人 Lerdorf ( 1995 )创建了 PHP 。之前, Ritchie 和 Thompson ( 1971 )创建了 C 语言,也就是我在大学从谭浩强那本书学到的。中国人至今还在不停地学习各种语言。 Perl 在业界的流行程度有比较,最近的 RedMonkranking 的排名是第 11 位,勉强在第一方阵吧。 RedMonk 的样本主要采集于 GitHub 和 Stackoverflow 。当然,有可能出现样本偏差,例如 Github 更注重新的语言,而早期的 Perl 或者 Java 都放在 Sourceforge 上面, Stackoverflow 则反映的更多的是语言的技术难度。此外,黑客经常使用的技术、公司招募的条件、相关计算机语言的书籍销量以及 GOOGLE 的查询频率,这些都能体现目前计算机语言的“流行”程度。总之, Perl 的趋势是在下滑,而且有脱离第一方阵的倾向,这个结论可以参考 TIOBE-Index 。 Perl 的最高点大约是 2005 年,随后开始下滑(目前来看, Java 仍旧是排名靠前, C++ 和 C 是开发者和雇主的偏爱)。 在中国,由于 yahoo 中国的退出, Perl 似乎在国内衰落了。由于 Perl 语言的创造者 LarryWall 来北京, PerlChina 组织的最近一次讨论会大约有 30 人参加。有幸和老 Larry 合影。 Larry 认为 Perl 语言可以实施“ freewill ”,这是哲学层面的比较。我的浅薄知识可能无法领会 Larry 的这个说法。毫无疑问,上帝具有“ freewill ”,而对于人类,这个命题是否成立,目前仍存在争论。我目前是这么认为,曾经一种流行的 CGI 语言,被强有力的新挑战者替代。 不过,我一直存疑 的问题是, Perl 是如何进入中国的? Larry 在 1987 年将 Perl1.0 发布到 comp.sources.misc 新闻组,那时中国互联网还处于雏形,应该最早出现于中科院高能物理所。 Perl4 最后结束的时间是 1994 , 1994 年中国的互联网才与国际的互联网沟通。那时我才刚进入大学。因此, Perl 是最早在高校流传,还是业余的爱好者首先推广,是官方还是民间自发的选择?由于我的学识有限,所以这个问题有待进一步的考证。但我粗浅的了解, Perl 在中国的普及应该是民间自发的,没有学校和官方的组织和身影。而 PerlChina 组织应该是 Perl 在中国普及的一个基石和探索。 PerlChina 实际上是 Perl 在中国普及的一个民间缩影。它似乎成立于 2001 年冬天。有一名计算机语言爱好者 Tsingson 注册了现有的域名(不过,现在的域名持有者是 Qiang ,可以通过 whois 查询这段历史的遗迹)。我在采访 PerlChina 的诸位前辈的时候,我的一个问题就是:“什么时候想要建立一个 PerlChina 的组织?当时的动机是什么?”。然而就是这个简单的问题,现在也无法考证,也可能是时间久远,记忆的片段更加模糊,很难确切地描述当时的动机。但肯定的是, PerlChina 是非盈利性机构,当然,每次 PerlChina 的大会,都有网络公司的慷慨解囊,或为之提供场地或免费提供午餐。 Perl-China 曾经的站长,包括: chunzi ,曾在 2001-2003 年主持 Perlchina 的站点管理工作。 Chunzi 退出管理后,目前从事的工作仍和 Perl 相关,在公司工作中仍然全面使用 Perl 语言开发、维护公司的项目。 Hoowa (网名)是 2003-2004 年参与 PerlChina 的站点管理的。 Hoowa 目前不再参与 Perl 的中国推广活动。目前他所在的公司也少部分利用 Perl 来完成一些项目。当然,他目前的工作与 Perl 的关系不大,这似乎是他完全退出 PerlChina 的原因之一。曾经的参与者: Nomas ( 2004 年底 -2010 年),由于工作紧凑,所以辞去站长的职责,但工作中仍然用到 Perl 。目前的维护者是 Achilles 。 PerlChina 站长的交接工作是自然而然的,没有特别的行政指令或者出于个人利益的诉求,这种自发的传承使得 PerlChina 的运行处于小众而稳定的状态。 根据回忆,早期 Perl 的实践者包括: Boysss(?) 四川省某工厂厂长,爱好写代码,曾在电脑报撰写文章。据 chunzi 回忆,他最早期接触 Perl 实际上是来自于 boysss 的翻译工作。 6y6( 六月六 ) 翻译 Perl 的 CGI 文档。 Netawk ,福建省硬件工程师。花斑猪, Perl 计数器的开发。华炼,曾在 yahoo 中国工作,开发网络商店;小林(DoNews ),全名林兴陆,曾在瀛海威和润迅工作过,参与移动互联网的开发;飞云小侠,据说毕业于北大,曾参与网络旅游。我想,早期实践者的踪迹已经很难寻觅到了, Perl 究竟是如何扩散的,很难找到源头。 不过,我觉得类似于美国篮球职业联赛,应该建立中国 Perl 名人堂,评价的唯一标准是对 Perl 的深层理解和应用。当然,我浅薄的知识还无法判断,有佛头著粪之嫌。在我的启发下,我采访的其中几位 PerlChina 的站长提名了若干人,但是我随后的考虑,觉得这种方式不太妥当,我既不是江湖上的百晓生,也没有能力评价中国 Perl 的程序员。只能拾人牙慧,而且很容易引起不必要的误解。不过, PerlChina 应该有自己的名人堂,用以激励后来的 Perl 使用者,并向 Perl 发展起到重要贡献的程序员致敬。 如果有更多的公司愿意招聘 Perl 程序员,那么 Perl 的发展肯定是无可限量的。目前采用 Perl 作为开发工具的有这么几家大的公司,如英国广播公司( BBC ),互联网电影资料库( IMDB ), Craigslist 等等。 Quora 上曾经有一个帖子是关于 Perl 有哪些大的公司使用。 VickyBrasseur 在 GitHub 发布了一个数据库,用来搜集目前使用 Perl 的公司。国内我几乎不太了解。 Achilles 给我的一封信指出,目前 国内 蓝汛、乐看网、音悦台、若比邻、阿里、去哪儿、 DeNA 等在采用 Perl 语言,而 PerlChina 在此方面做得工作乏善可陈。我想,执着的兴趣和高位数的薪金,将绝对促进 Perl 在国内的发展和普及。现在 Perl 几乎边缘化了。 对于历史的回顾,我对于 Perl 在中国以及 PerlChina 的历史仍有很多疑点。比如,与台湾相比, Perl 为什么没有在大陆地区发展起来(这个问题是 chunzi 提出的)?原因是什么?我们和欧美的差距具体在哪里?有哪些成功的经验可以移植?又有哪些中国本土的文化可以借用,从而通过 PerlChina 推动 Perl 在中国的发展? CPAN 上有多少模块是大陆 Perl 爱好者提供的作品?下载量是多少?还有哪些 Perl 的前辈和传奇人物应该在名人堂内以及如何界定这种遴选标准?当然,还有很多细节有待考证,例如, PerlChina 组织的全国性会议有几次?会议地点和人数?谁是赞助商?有哪些人士参与会议的组织?有多少人通过 PerlChina 找到了工作? 本文主要采访了 PerlChina 历史上的站长,根 据 他们的回忆并蒙许可, 将主要内容通过我的博客发布。如有历史上的知情者,请一定联系我。
3250 次阅读|0 个评论
perl 遗传算法
autodataming 2014-4-28 17:06
需要解决的问题是 求 # y=x*sin(10*pi*x)+2 # x-seq(-1,2,0.01) 在x的范围内y的最大值对应的x,精确到4位小数 属于单基因的遗传算法,交叉不能带来新的基因 ################################################################# 生物和计算的交叉,给计算引入了遗传算法 染色体 基因 突变 交叉(重组) 选择 计算和生物的交叉,带来了计算机辅助药物设计 #################### #!/usr/bin/perl -w #use strict; # x-seq(-1,2,0.01) use AI::Genetic; my $ga = new AI::Genetic( -fitness = \fitnessFunc, -type = 'rangevector', -population = 500, -crossover = 0.9, #一个基因的话 没有交叉的必要0.9 -mutation = 0.1, -terminate = \terminateFunc, ); my @gene1; $ga-init( ]);#基因的数目 $ga-evolve('rouletteTwoPoint', 100); # 选择的方法 一共进化的代数 my $individual=$ga-getFittest(1); my $resultx=$individual-genes(); $resultx=@$resultx /10000; print Best score = , $individual-score(), correspond genes: , $resultx, \n; sub fitnessFunc { my $genes = shift; my $fitness; # assign a number to $fitness based on the @$genes # ... # y=x*sin(10*pi*x)+2 my $genes1=@$genes /10000; $fitness=$genes1*sin(10*3.14159*$genes1)+2; # print $genes1 $fitness\n; return $fitness; } sub terminateFunc { my $ga = shift; # terminate if reached some threshold. my $THRESHOLD=4; return 1 if $ga-getFittest-score $THRESHOLD; return 0; } ####################### 算的答案是Best score = 3.8492704037941 correspond genes: 1.8495 Best score = 3.84999793705916 correspond genes: 1.8511 ###################### ########需要修改pm中的optMutation.pm文件############################### ##### for my $g (@$genes)修改为 for my $g (@$genes-1)################################## package AI::Genetic::OpMutation; use strict; 1; # This package implements various mutation # algorithms. To be used as static functions. # sub bitVector(): # each gene is a bit: 0 or 1. arguments are mutation # prob. and anon list of genes. # returns anon list of mutated genes. sub bitVector { my ($prob, $genes) = @_; for my $g (@$genes) { next if rand $prob; $g = $g ? 0 : 1; } return $genes; } # sub rangeVector(): # each gene is a floating number, and can be anything # within a range of two numbers. # arguments are mutation prob., anon list of genes, # and anon list of ranges. Each element in $ranges is # an anon list of two numbers, min and max value of # the corresponding gene. sub rangeVector { my ($prob, $ranges, $genes) = @_; my $n= scalar(@$genes); #print end: $n \n; my $i = -1; for my $g (@$genes-1) { $i++; next if rand $prob; # now randomly choose another value from the range. my $abs = $ranges- - $ranges- + 1; $g = $ranges- + int rand($abs); } return $genes; } # sub listVector(): # each gene is a string, and can be anything # from a list of possible values supplied by user. # arguments are mutation prob., anon list of genes, # and anon list of value lists. Each element in $lists # is an anon list of the possible values of # the corresponding gene. sub listVector { my ($prob, $lists, $genes) = @_; my $i = -1; for my $g (@$genes) { $i++; next if rand $prob; # now randomly choose another value from the lists. my $new; if (@{$lists- } == 1) { $new = $lists- ; } else { do { $new = $lists- }]; } while $new eq $g; } $g = $new; } return $genes; } __END__ =head1 NAME AI::Genetic::OpMutation - A class that implements various mutation operators. =head1 SYNOPSIS See LAI::Genetic. =head1 DESCRIPTION This package implements a few mutation mechanisms that can be used in user-defined strategies. The methods in this class are to be called as static class methods, rather than instance methods, which means you must call them as such: AI::Genetic::OpCrossover::MethodName(arguments) =head1 CLASS METHODS There is really one kind of mutation operator implemented in this class, but it implemented for the three default individuals types. Each gene of an individual is looked at separately to decide whether it will be mutated or not. Mutation is decided based upon the mutation rate (or probability). If a mutation is to happen, then the value of the gene is switched to some other possible value. For the case of Ibitvectors, an ON gene switches to an OFF gene. For the case of Ilistvectors, a gene's value is replaced by another one from the possible list of values. For the case of Irangevectors, a gene's value is replaced by another one from the possible range of integers. Thus, there are only three methods: =over =item BbitVector(Imut_prob, genes) The method takes as input the mutation rate, and an anonymous list of genes of a bitvector individual. The return value is an anonymous list of mutated genes. Note that it is possible that no mutation will occur, and thus the returned genes are identical to the given ones. =item BlistVector(Imut_prob, genes, possibleValues) The method takes as input the mutation rate, an anonymous list of genes of a listvector individual, and a list of lists which describe the possible values for each gene. The return value is an anonymous list of mutated genes. Note that it is possible that no mutation will occur, and thus the returned genes are identical to the given ones. =item BrangeVector(Imut_prob, genes, rangeValues) The method takes as input the mutation rate, an anonymous list of genes of a rangevector individual, and a list of lists which describe the range of possible values for each gene. The return value is an anonymous list of mutated genes. Note that it is possible that no mutation will occur, and thus the returned genes are identical to the given ones. =back =head1 AUTHOR Written by Ala Qumsieh Iaqumsieh@cpan.org. =head1 COPYRIGHTS (c) 2003,2004 Ala Qumsieh. All rights reserved. This module is distributed under the same terms as Perl itself. =cut genetic.pl OpMutation.pm
个人分类: 算法|2902 次阅读|0 个评论
perl GUI TK
zoubinbin100 2014-3-24 16:52
perl在分析生物信息数据时十分方便,但是在数据可视化上就比较困难,尤其是想开发一个GUI。目前也有很多模块能开发GUI,Tk是其中的一个,但是比起Matlab,VB之类的就显得很吃力。目前很想用perl开发一个生物信息软件处理Sanger sequence(abi),功能包括序列拼接,杂合碱基的识别,SNP识别,突变识别。底层perl代码基本已经实现,但是在软件图形化上却遇到了十分大的问题,甚至想过先用perl处理abi文件,然后再用VB开发GUI显示结果,其实Java挺合适的开发生物信息的GUI,因为BioJava功能十分强大,个人对Java不是十分熟悉,另外python也是个十分不错的选择,有很多生物信息软件都是python开发。 下面列出Tk的参考网址,以便以后开发GUI使用。 IBM: https://www.ibm.com/developerworks/cn/aix/library/au-perltkmodule/ Mastering Perl Tk: http://docstore.mik.ua/orelly/perl3/tk/
个人分类: Perl|1180 次阅读|0 个评论
perl 两条序列比对
zoubinbin100 2014-3-17 17:05
利用perl进行两条序列比对有多种方法,其中bioperl里有一个Bio::Tools::Run::Alignment::Clustalw,但是在使用Bio::Tools::Run::Alignment::Clustalw模块时,我觉得有两个问题:1,两条序列的比对分数输出到了标准输出,比较难得倒这个分数;2,matrix矩阵不知道怎么使用自己定义的。因为用BLOSUM矩阵,发现在比对以下2条序列时有点小问题。 seq1:AGCC seq2:ACT 程序输出: AGCC . ACT 应该是: AGCC A .CT 对于第一个问题可以通过别的方法解决,但是第2个问题,就不知道该如何解决,搜素网上,倒是有很多perl的代码实现用动态规划比对对两条序列( http://yixf.name/wp-content/uploads/2011/03/a-perl-program-for-sequence-alignment.pdf ),以及bl2seq,Bio::Tools::pSW方法( http://biochemistry.utoronto.ca/steipe/abc/index.php/BioPerl_exercise_alignment ),但是如果能使用自定义矩阵,就可以进行很多个性比对,进行搜索发现Bio::Tools::dpAlign似乎可以使用自定义替换矩阵。
个人分类: 生物信息|1696 次阅读|0 个评论
perl 语言中的given-when
zhaojianhua 2014-2-25 21:59
试图使用Perl对一个文档中的内容进行分类筛选,由于在待选的项目中,存在着同时满足不同分类的选项。if会出现一些问题。想起同C语言中switch语句类似的given-when语句,没想到发现了两个问题。 首先,我使用的perl版本为5.14.2,脚本写好后一直提示我有语法错误。随手翻开教科书,发现脚本前边有版本限制,于是在其它内容不变的情况下加了一句use 5.0.1.0,居然不再有错误提示。确实不知道新的版本中这个语句有了什么变化。 另外一个语句就是无论怎样,default语句都会执行。有论坛说可以把上一个判断的continue去掉,尝试了一下,并没有解决问题。google了一下这个问题,原来很多人都遇到了这样的事情,难道是传说中的bug?
4211 次阅读|0 个评论
C语言数值计算版
felonwan 2013-12-21 01:24
C/C++效率高,用来做系统底层的设计无疑是很好的,但是现在也有很多人用来做数值计算。 不过C/C++并没有为数值计算优化。最简单的,比如:幂函数居然要写成pow(x,n)这样比较复杂的形式,如果使用x^n更符合直觉,更易用;复杂一点的,Fortran里有对矩阵的操作块的操作,C/C++里只能一个数一个数地操作。 如果能做一个编译器级别的改变肯定是最好的,引入一些对于数值计算更易用的语法,再引入一些数值计算库,这样或许可以开发一个C/C++数值计算的变种。不过这个事笔者目前是没有这能力。如果有人有能力而且感兴趣,不妨建个开源项目什么的。 易学易用是重要的一方面,但是功能的强大、方便扩展无疑更重要。如果这个C/C++的分支相对于原始C/C++及其它科学计算语言来说没有很大的优势,肯定做不起来,不如不做!目前Fortran做数值计算就比C易学易用一些;科学计算的库,也已经有很多了,有类似matlab矩阵操作的库函数,有符号计算的库;matlab、mathematica这样的脚本语言很成熟,易用扩展性强;结合C和python脚本的scipy和numpy这样的科学计算平台做得也很好,用的人不少。 这里,笔者介绍一个自己做的小东西。不改变标准C语法,只是写程序的时候:用$表示标准C语言中的按位异或,用^表示乘方,然后在预处理的时候再转换回去。(这种事情意义不大,如果能成为标准才有意义)。 下面是把“x^n”转变成“pow(x,n)”的Perl脚本,考虑各种可能的情况: 最终版本如下: #!/usr/bin/perl my \$levelN = qr/ (? + | \( (??{ \$levelN }) \) )* /x; while (STDIN) { (/\^/) while s/(\w*\.*\w+| *\(\$levelN\))\s*\^\s*( *\($levelN\)|\w+\.*\w*)/pow(\$1,\$2)/; print \$_; } 用法cat filename.c | ./perfect new_filename.c 测试例子: $ echo -e a.b^(c+d)^(e-f/g^h*i) | ./perfect pow(pow(a.b,(c+d)),(e-f/pow(g,h)*i)) $ echo -e ^ (c+d) *^/ (e-f/g^h*i) | ./perfect ^ (c+d) *^/ (e-f/pow(g,h)*i) 功能完整、不处理语法错误、健壮、很简洁。 默认a^b^c为(a^b)^c。 缺点:会有些非必要的括号。 最初的版本,加上规避a^b^c形式的功能,好处是具有去掉非必要括号功能,缺点是代码里面4种不同类型的字符替换代码重复度高、顺序不能变: #!/usr/bin/perl # dynamic regexp my \$levelN = qr/ (? + | \( (??{ \$levelN }) \) )* /x; # do the replacement and print to screen. while(STDIN){ my \$line = \$_; my \$line1 = \$line; if(/\^\s*\(\$levelN\)\s*\^/ | /\^\s*\w*\.*\w*\s*\^/){die Error: Form 'A^B^C' is not allowed, please clarify it as '(A^B)^C' or 'A^(B^C)'!;} while(1){ \$line1=~ s/\((\$levelN)\)\s*\^\s*\((\$levelN)\)/pow(\$1,\$2)/g; #(a+b)^(c+d) if(\$line1 eq \$line){last;} \$line=\$line1; } while(1){ \$line1=~ s/(\w*\.*\w+)\s*\^\s*\((\$levelN)\)/pow(\$1,\$2)/g; #a^(b+c) if(\$line1 eq \$line){last;} \$line=\$line1; } while(1){ \$line1=~ s/\((\$levelN)\)\s*\^\s*(\w+\.*\w*)/pow(\$1,\$2)/g; #(a+b)^c if(\$line1 eq \$line){last;} \$line=\$line1; } while(1){ \$line1=~ s/(\w*\.*\w+)\s*\^\s*(\w+\.*\w*)/pow(\$1,\$2)/g; #a^b if(\$line1 eq \$line){last;} \$line=\$line1; } print \$line } 用法:./topow filename.c newname.c 第一次写的perl脚本,边学边写的。 另外可以参考相关讨论和网友zhao4zhong1的C语言版本源代码:http://bbs.csdn.net/topics/390671469
个人分类: 程序世界|7233 次阅读|0 个评论
统计字符串中指定字符个数
liujd 2013-11-21 14:18
use strict; my (\$count, \$st); \$_=asdfadsfPadfadsfPPPsfdPasdfasdfP; \$count=()=(\$st=~/P/g); print \$count;
个人分类: perl|873 次阅读|0 个评论
perl的LWP 和linux 的crontab每天自动到小木虫上取金币
autodataming 2013-11-7 09:22
背景:论坛为了吸引人气,会推出虚拟金币活动,每天登陆可以领取金币,而金币又可以用来获得一些资料。 所以我就写了一个自动领取金币的小机器人。 方法介绍: 我不知道目前的浏览器是否可以调用里面的函数, 所以我自己创建了一个虚拟浏览器,这个浏览器必须自带cookie的功能 然后构建了一个请求,这个请求包含用户名,密码,以及click的动作, 最后通过浏览器向服务器发送请求,并接受服务器的返回的信息 然后就取领金币了,领完金币,记录下时间,以及当前金币的数量 crontab -e #编写定时任务,每天2点2分执行这个任务 2 2 * * * /home/xx/emuch.pl /home/xx/log ============================================================================= #!/usr/bin/perl -w use strict; #配合linux 的crontab,每天自动领取金币 use LWP; use HTTP::Request::Common qw( POST ); my $browser=LWP::UserAgent-new( cookie_jar={}); #非常重要 $browser-agent(MyApp/0.1 ); my $username='Z'; my $password='c'; my $req = POST('http://emuch.net/bbs/logging.php?action=logint=1383722643', ); my $res = $browser-request($req); #print $res-code; #http://emuch.net/bbs/memcp.php?action=getcredit #creditsubmit ?????? 37 #formhash bede779d 17 my $request=POST('http://emuch.net/bbs/memcp.php?action=getcredit', ); my $response = $browser-request($request); my @text=split(/\n/,$response-content); system(date); foreach my $line(@text) { if($line=~/金币: (\d+)/) { print $1,\n; last; } }
个人分类: 奇技淫巧|4074 次阅读|0 个评论
hash 排序
liujd 2013-10-9 14:01
个人分类: perl|3 次阅读|0 个评论
为什么是Perl, 为什么是R?
热度 3 zhaojianhua 2013-8-5 11:29
昨天周末,在宿舍写了一天的东西,也就午饭时间和晚饭时间在附近的沙县小吃吃了点东西。也就是在路上,看到一个小书摊(在板车上那种可以随时移动你那种),在最显目的位置摆放了一本《大数据时代》,很是吃惊,这种书的销量应该远赶不上乔帮主的传。 驾驭大数据,似乎是最近几年最让人兴奋的事情。数据的爆炸,势必引起管理工具的更新。计算机作为数据处理的平台,为处理驾驭数据提供了极大方便,数据分析软件和计算机语言当仁不让的承担了更重要的作用。天下没有免费的午餐,好用的软件价格不菲,大多数人选择盗版。 除去知识产权的问题不说,软件的功能越强大,意味着对硬件要求越高。此时掌握一门或者几门计算机语言对大数据处理是多么重要。 大学的课程接触了VB和C语言,和大多数生物专业的学生一样大学毕业基本就还给了任课教师。仅存的记忆就是复杂的参数传递和要命的指针。硕士阶段要做生态模型,以及生化反应建模,不得不重新进行计算机语言学习,幸好基本语法还记得。并且当时的导师精通多门语言,为将来的研究工作扫平不少障碍。当时C++盛行,导师又负责这门课,有就有幸和本科生一起上课,当没想到这后来成了我的梦魇。 既然做模型,自然少不了matlab,在计算画图的能力上,C++是不可比拟的。但matlab被大家称为数学草稿纸,当时严谨的C++简直让我对matlab疯狂。但还是按照C++的格式去写matlab程序,虽然丑陋,运行就可以。matlab记不得哪年开始,每年出两个版本,对于盗版使用者简直是灾难。 博士接触生物信息,被推荐Perl。Perl的创始者形容perl就是一门为打着火把的叛逆青年准备的。没有复杂的格式要求,形式追求简单。崩溃!彻底的崩溃!还好,我照样可以按照C++的格式写出丑陋的Perl脚本。最近接触R,创始者生物信息学出身,对R的评价是胆小者不适合。当然,如果这两门语言就是叛逆,不会赢得这么多爱好者孜孜不倦的追求。首先,两门语言的开源性,迎合了大部分学生,也避免他们陷入将来不必要的知识产权麻烦。其次,无论你想做什么,好像都有人为你写好了程序包,你要做的就是按照程序包作者要求进行调用就可以。这给我这种笨并且懒的人提供了莫大好处。 总结一下,这两门语言吸引人的地方一是免费,再就是你可以很懒的享受比人的劳动成果,不必担心他追究你产权的问题。写程序的人会以自己的代码被人认可而骄傲。最后就是你可以得到来自于这两门程序语言爱好者热情而且无偿的帮助。
5860 次阅读|5 个评论
shell命令结果到perl数组和shell执行结果保存shell数组
liujd 2013-7-1 15:26
个人分类: perl|0 个评论
用python或perl语言简单验证RSA算法
热度 1 cambaluc 2013-6-27 22:25
python或perl语言都提供了很方便的对大整数计算的功能,这在C或Fortran中不易实现,需调用相关的库或另编程序。 多年前听公开课,一位老师给学生讲电子商务安全,涉及到公钥密码,讲得生动,但没公式没具体的例子,总觉不合适,后来想想,找几个数做例子因涉及到大整数运算,可能还真有点难度。 有python或perl进行大数运算,就很容易了。 RSA加密算法是1977年Ron Rivest、Adi Shamir和Leonard Adleman一起提出的。所以别说数论或陈景润研究的没多大用,这就是最好的应用例证。 找两个大质数p、q,设n=p*q ,r=(p-1)*(q-1), 找e与r互质,且er 找d满足(d*e) mod r =1,(mod为取余) (n,e) 就是公钥,(n,d)就是私钥,也可互换, 设M为明文整数 (把明文分解转换为小于n的数),C为密文 则加密过程为 C=M^e mod n 解密过程为 M=C^d mod n (^表示乘方运算) 一、不编程用python验证 设p=23,q=31,则n是23*31=713,r=(23-1)*(31-1)=660 设e=53,可找到一个d=137,(不想编程,用excel公式=MOD((A1*53),660))往下一拉就可找到(A列填自然数,B列写公式)。 则有(713,53),(713,137)为公钥和私钥。 如把公钥给对方,其对123加密:写123**53%713,加密结果为216。 用私钥解密:216**137%713,解密结果为123。 123**53是582064223547422878717064247856117219999744776198031672118462507358927240593089706379581941870601919048920591883。216*137更是一个大数。 二、用perl验证 同上例选23,31,找数d perl -e foreach $d (1..1000){ print($d),last if 53*$d%660==1 } 得出137。 对456加密及解密 D:perl -Mbigint -e print 456**53%713 654 D:perl -Mbigint -e print 654**137%713 456 其实23,37都是很小的素数,数字游戏,也挺有意思
个人分类: 算法|8042 次阅读|3 个评论
perl模块安装
liujd 2013-6-27 11:24
一、联网利用CPAN安装 (1)perl -MCPAN -e shell  如果没有设置cpan参数,则进入设置,一路回车,最后给定两个镜像地址:国外: http://www.cpan.org/   http://www.perl.com/CPAN-local/   (2)进入cpan后,执行install 模块名即可。
个人分类: linux|933 次阅读|0 个评论
[转载]Perl和Python之间的一些异同
lingtingjiangla 2013-5-13 15:35
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-perl2python/index.html 张 颖 , 软件工程师, IBM 简介: Python 和 Perl 作为主流脚本语言中的成员,在语法等方面有很多相似之处,却又存在一定的差异。本文通过对这两种语言的比较,从而使得相关开发人员可以更深刻的了解和掌握这两种语言 关于 Perl 与 Python 的起源和特点 Perl 是 Practical Extraction and Report Language 的简称,由 1987 年 Larry Wall 创建,最初的目的是为了在 UNIX 上方便处理报表,经过长期的发展已经成为一种全功能的程序设计语言,当前最新的版本为 Perl5.14.1 , Perl 作为一种自由而强大的编程语言,其中心思想是: There's More Than One Way To Do It 。(不只一种方法來做这件事 ) ,即「 Tim Toady 」。作为一种 “ 胶水型 ” 语言,它具有强大的正则表达式和模式匹配功能以及灵活的数据结构,如动态数组、 Hash 等,在语法规则上借鉴了 C/C++ 、 Basic 、 Pascal 等语言,其不足之处在于存在一些冗余语法,代码的可读性较差。 Python 是一种基于面向对象的解析性交互式的开源编程语言,它起源于 1989 年末由 CWI (阿姆斯特丹国家数学和计算机科学研究所)的研究员 Guido van Rossum 创立, 1991 年初公开发行,其开源式的发行方式促进了 Python 的较快发展,目前已经形成了一个强大的社区力量。 Python 开发者的哲学是 “ 用一种方法,最好是只有一种方法来做一件事 ” 。 Python 具有简单易学、代码规范、语法简单、可移植性强、支持多平台、类库丰富等优点。 Perl 和 Python 都是开源的,但其哲学理念却刚好相反,因此常被人们将这两种语言放在一起进行比较。下面的篇章将从基本数据类型、控制流、函数、面向对象、文本处理等方面对这两种语言进行简单的比较和鉴别。 回页首 Perl 与 Python 的基本数据类型 脚本语言支持多种数据类型,变量无需事先申明,类型根据值来动态确定,一个变量在程序中可以根据上下文环境的不同存储不同类型的值。 Perl 支持的基本数据类型包括:标量、数组、哈希。在定义的时分别用 $ 、 @ 、 % 表示。 1. 标量 (scalar) :标量是 Perl 中最简单的数据类型,大多数标量由数字或字符串组成。其中数字类型如整数、浮点数等,字符串有单引号和双引号内两种形式,对长度没有限制。两者的区别在于在单引号内 \n 不代表换行,而代表反斜线和 n 这两个字符,双引号内字符串则可以通过反斜线进行转义。字符串的操作符有 . 拼接操作符和 x 重复操作符等。 2. 数组 (Arrays) :数组用 @ 定义,如 my @array=(a,b,c,d); 访问数组的元素用 $array 。在 perl 中,数组也可以当做堆栈来处理,支持的操作符包括 pop 和 push , shft 和 unshift 。两组操作的区别在于前者对数组的尾部进行处理,而 shift 和 unshift 则针对数组的头部进行处理。 pop 得到的是数组的最后一个元素,如 pop ( @array ) = d ,如果数组为空,则返回 undef 。而 shift(@array)=a 。 3. 哈希:也称作关联数组,是根据关键码值 (Key value) 而直接进行访问的数据结构。用 % 定义,如 %my_hash=(“key1”=”23”,”name”=”zhang”,”age”=”24”) ,其中键以字符串表示, Hash 可以是任意大小。 与 hash 相关的函数有: keys :返回 hash 的键列表 my @keylist = keys %hash value :返回值列表 my @valuelist = values %hash each :用两个元素的列表返回键值对。 while(($key,$value)= each %hash) { print “$key =$value\n”; } Python 支持五种基本数据类型:数字 (Numbers) 、字符串 (String) 、列表 (List) 、元组 (Tuple) 和字典 (Dictionary) 。其中数字和字符串和 perl 中的标量对应,列表和数组对应,元组可以看做是不可变的列表,字典和 hash 对应。 1. 数字 (Numbers) : Python 支持五种基本数字类型,分别为 int( 有符号整数 ) 、 long( 长整数 ) 、 bool( 布尔值 ) 、 float( 浮点数 ) 、 complex( 复数 ) 。 2. 字符串 (String) : Python 与 Perl 一样也支持单引号和双引号字符串,但与 Perl 不同,转义字符在单引号中也会起作用。同时 python 还支持三引号字符串,它允许一个字符串跨多行,字符串中可以包含换行符,制表符以及其他特殊字符。三引号字符串常用于注释或者形成文档。字符串支持成员操作符 in , not in ,连接操作符 + 以及重复操作符 * 。 Python 字符串可以当做 list ,支持切片操作符 和反向索引。如下: 如 aString=”abcd” ;则 aString 的值为 a , aString =bc ,反向索引 aString =d 3. 列表 (List) : Pyhon 中的列表与 Perl 中的数组相对应。列表的定义使用 ,支持动态增加和删除元素以及切片操作。 增加元素可以使用 li.append(“test”),li.insert(2,”new”) 以及 li.extend( ) 删除元素使用 li.remove(“f”) 和 li.pop() 。但需要注意的是 remove 仅删除首次出现的,而 pop 会删除 list 最后的一个元素,然后返回删除的元素的值。 4. 元组 (Tuple) :元组和列表非常相似,但用()表示,并且元组是不可变的。 5. 字典 (Dictionary) : 字典跟 Perl 中的 hash 一样,定义了键值对之间一对一的关系,变量可以任意取名, Python 会在内部记录其数据类型。定义一个字典: D={“name”:”Jon”,”Family”:”SH”}, 字典中的 key 是不能重复的,并且大小写敏感,同时字典中的元素是无序的。字典也支持增删操作,往字典中添加元素 D =23, 删除元素 del D ,如果需要删除所有元素可以使用 D.clear(), 或者 del D 删除整个字典。 回页首 Perl 与 Python 的控制结构 在控制结果方面, Perl 较 Python 丰富,除了支持传统的 if 、 while 、 for 控制结构,还支持 until 、 unless 、 foreach 等, Python 的控制结构相对要少一些,但已经能够满足语言的要求。本节对这些控制结构进行详细比较。 If 控制结构: Perl 与 Python 都支持 if 、 if-else 、 if-else if- else 三种结构,两者在语法上基本类似,但与 Python 不同的是 Perl 中没有 boolean 类型,零和空表示 False ,其余表示 True ,而 Python 中除了 '' 、 、 0 、 () 、      } 1. 基本语法: def functionName(arg1,arg2, ): statement 2. 内嵌函数: Python 支持内嵌函数 , 其方法是在外部函数的定义体内定义函数 , 但整个函数体都在外部函数的作用域之内 . def outfun(): def innerfun(): Print “inner fun test” print “out fun test” 返回值 使用 return 语句显示返回;如果没有 return ,默认返回最后一次运算的结果 使用 return 语句显示返回,没有 return 语句,默认返回为 None 。如果函数返回多个对象, python 把他们聚集起来并以一个元组返回。 调用 函数名(参数 1 ,参数 2 , ... ),如果声明在前,可以省略 。如果用户所定义的子过程与内置函数重名,则不能省略 。 如下例必须使用 chomp 调用: sub chomp{ print “it is my chomp\n”; } 1. 直接采用 函数名(参数 1 ,参数 2..... ) 2. 函数名(参数名 1= 值,参数名 2= 值 .......) 函数参数 1. 在子程序调用的后面加上被括号圈引的列表表达式即可,所有的参数都会自动存储为 @_ 中,其中第一个参数为 $_ , 第二个参数存储 $_ 。 2. 传递引用,在参数前加入 \ 表示为引用 1. 按照参数声明的关键字顺序直接传递; 2. 通过关键字参数 testFun ( par1=“2” , par2=“45” ) 3. 默认参数: Python 在传递参数的时候支持默认参数,规则是所有的位置参数必须出现在任何一个默认参数之前,如 def fun(arg1,defarg1=”var1”,defarg2=”12”), 如果在调用的时候没有给出参数值,则会使用默认值 4. 变长参数: 一种方法是利用非关键字可变长参数 , 可变长的参数元组必须在位置和默认参数之后 , 带元组的函数语法如下: def function_name( *vargs_tuple): function_body 其中 * 之后的形参将作为元组传递给函数。 另外一种方法是利用关键字变量参数,区别是在函数的参数变量里使用 ** 。 def dicVarArgs(arg1,arg2=”default”,**theRest): print 'formal arg1:', arg1 print 'formal arg2:', arg2 for eachXtrArg in theRest.keys(): print 'Xtra arg %s: %s' % \(eachXtrArg, str(theRest )) 回页首 Perl 与 Python 的包与模块 Perl 程序把变量和子程序的名称存贮到符号表中, Perl 的符号表中名字的集合就称为 Perl 包 (package) 。定义语法为: package mypack ;每个符号表有其自己的一组变量、子程序名,各组名字是不相关的,因此可以在不同的 Perl 包中使用相同的变量名,而代表的是不同的变量。 Perl 模块有两种来源,一种是随 Perl 发行版本一同打包的,另外就是用 CPAN 中下载的。 Perl 模块和包的概念并不清晰,两者有时可以混用。在程序中使用模块的操作称为导入模块;导入模块关键字 use ;如: use ModuleName ;模块被导入后,其中的子程序和变量就可以直接使用了;要取消一个已经导入了的模块,可以使用关键字 no ;如: no ModuleName 。 一个 .py 文件就是一个 python 模块。把一堆相关的 python 模块放在一个目录下,再加上一个 __init__.py 文件就构成了一个 python 包。在 Python 另一个程序中导入模块用 import module 或者 from module import * ,两者的区别在于: import module 会导入 module 这个模块里的所有标识,但是这些标识现在都在 module 名字空间下。 from module import * 也会导入 module 中所有标识,但是标识放到在当前名字空间里。 导入模块或包按下面顺序进行路径查找: 1. 当前目录 2. 环境变量 PYTHONPATH 所指的目录列表 3.python 解释器的安装目录 回页首 Perl 与 Python 中的 OOP 在 Perl 中,类是 Perl 包,含有提供对象方法的类,而方法是 Perl 的子程序,类名是其第一个参数,对象是对类中数据项的引用。在 Perl 中创建一个新类,首先要创建一个包,扩展名为 .pm, 在创建 perl 包的时候程序的最后一个必须为 1; ;否则该包不会被 Perl 处理。 清单 1. 创建 perl 的类和对象 package person; use strict; sub new { my $class = shift(); print(CLASS = $class\n); my $self = {}; $self-{name} = shift(); $self-{sex} = shift(); bless $self, $class; return $self; } 1; 其中 new() 方法是对象的构造函数,是创建该类的对象实例必须被调用的,它返回该对象的引用。将类名与引用相结合称为 ”bless” 一个对象,其语法为: bless YeReference YeReference 是对被 ” 祝福 ” 的对象的引用, classname 是可选项,指定对象获取方法的包名,其缺省值为当前包名。也可以通过函数 bless 来声明一个构造函数。 sub new { my $class = shift; my $self = {}; bless $self, $class; return $self; } 创建一个对象可以直接使用 new 关键字。 $object = new Person( mohand, sam, 345); Perl 类中的方法就 Perl 的子函数,规定第一个参数为对象或者被引用的包,分为静态方法和虚方法。 虚方法通常首先把第一个参数 shift 到变量 self 或 this 中,然后将该值作普通的引用使用。一是通过该对象的引用 ( 虚方法 ) ,一是直接使用类名 ( 静态方法 ) 。如上例中如果类 Person 中有 getContactList 则可以直接使用 $object-getContactList() 来调用该方法。 Perl 支持重载,当两个不同的类中含有相同的方法名称的时候,可以用 :: 操作符指定使用哪个类中的方法。 $mess = Qava::grind(whole,lotta,bags); Qava::grind($mess, whole,lotta,bags); 由于 Perl 采用了简单的、基于引用的垃圾回收系统。 Perl 跟踪对象的链接数目,当某对象的最后一个应用释放到内存池时,该对象就自动销毁。因此一般不需要定义类的析构函数。 Perl 通过数组 @ISA 支持继承。 package Employee; use Person; use strict; our @ISA = qw(Person); # inherits from Person 当子类继承父类的时候,继承了父类的所有方法,但子类也可以覆盖父类的方法。如加入 Employee 想覆盖父类的 getFirstName : #!/usr/bin/perl package Employee; use Person; use strict; our @ISA = qw(Person); # inherits from Person # Override helper function sub getFirstName { my( $self ) = @_; # This is child class function. print This is child class helper function\n; return $self-{_firstName}; } 1; 调用直接使用 $firstName = $object-getFirstName(); 如果要调用父类的 getFirstName ,则可以使用 $object-Person::getFirstName(); 在 Python 中创建一个类的基本语法为 : class className(bases): classBody 参数 base 可以是一个单继承或者多继承的父类, object 是所有类的父类,位于类继承结构的最上层。类的构造函数为 __init__() ,其中构造函数中 self 会作为第一个默认的参数。而类的析构函数则是 __del__() ,访问类的方法和属性可以直接使用 . 访问符。 Python 不支持纯虚函数或抽象方法,并且声明和定义没有本质区别。一般或者 Python 类的属性可以通过 __dict__ 或者 dict ()访问。常见属性有 __name__ , __doc__ , __base__ , __dict__ 。 Python 中创建一个类的实例,不需要关键之 new ,直接使用类名 () 即可。如 c=myclass() 。 Python 不仅仅支持单继承和多继承,同时还支持方法的覆盖 . class P(object): def foo(self): print 'Hi, I am P-foo()' p = P() p.foo() Hi, I am P-foo() 现在创建 C 类 , 继承于 P class C(P): def foo(self): print 'Hi, I am C-foo()' c = C() c.foo() Hi, I am C-foo() 当从一个带构造器 __init()_ 的类派生,如果在子类中覆盖了 __init__() ,当子类被实例化时,基类的 __init__() 方法不会被自动调用。如果必须调用基类的构造方法,可以使用父类名 .__init__(self) 方法或者 super( 子类名, self).__init__() 。 如 def __init__(self): super(C, self).__init__() print calling C's constructor Python 类和实例支持一些内建函数,如 Issubclass(sub,sup) :判断一个类是另一个类的子类或子孙类; isinstance(obj1,obj2) :判定一个对象是否是另一个给定类的实例; 回页首 Perl 与 Python 的正则表达式 正则表达式是 perl 比较突出的一大特色, perl 中正则表达式有三种形式: 匹配: m/regexp/ (还可以简写为 /regexp;/ ,略去 m ) 替换: s/pattern/replacement/ ,为了语法的简化用 /pattern/replacement/ 表示,略去 s 转换: tr/charClass/substituteClass/ 这种形式包含一系列的字符 — /charClass — 同时把它们替换为 substituteClass 。 表 3. Perl 常用匹配模式 语法 说明 示例 . 匹配除换行符以外的所有字符 b.c 匹配 bac x? 匹配 0 次或一次 x 字符串 b?c 匹配 c 或者 bc x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数 b*c 匹配 c 或者 bbc x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数 b+c 匹配 bc 或者 bbc .* 匹配 0 次或一次的任何字符 b.*c 匹配 bgdc 等 .+ 匹配 1 次或多次的任何字符 b.+c 匹配 bgc 等 {m} 匹配刚好是 m 个 的指定字符串 b{5}c 匹配 bbbbbc {m,n} 匹配在 m 个 以上 n 个 以下 的指定字符串 b{1,2} 匹配 b 或者 bb {m,} 匹配 m 个 以上 的指定字符串 b{2,} 匹配 bb 或者 bbb 等 内的字符 b c 匹配 bdc 匹配不符合 c 匹配 bAc 匹配所有数字字符 b c 匹配 b1c 匹配所有小写字母字符 b c 匹配 bac ^ 匹配字符开头的字符 ^perl 匹配以 perl 开头的字符 $ 匹配字符结尾的字符 perl$ 匹配以 perl 结尾的字符 \d 匹配一个数字的字符,和 语法一样 b\dc 匹配 b1c \D 非数字,其他同 \d b\Dc 匹配 bAc \w 英文字母或数字的字符串,和 语法一样 b\wc 匹配 b1c 等 \W 非英文字母或数字的字符串,和 语法一样 b\Wc 匹配 b c \s 空格,和 语法一样 b\sc 匹配 b c \S 非空格,和 语法一样 b\Sc 匹配 bac 等 \b 匹配以英文字母 , 数字为边界的字符串 \bbc\b 匹配 bc 但不匹配 bca \B 匹配不以英文字母 , 数值为边界的字符串 sa\B 将匹配 sand 和 Sally 等字符串,而不能匹配 Melissa. a|b|c 匹配符合 a 字符 或是 b 字符 或是 c 字符 的字符串 abc 匹配含有 abc 的字符串 匹配 a 或者 b 或者 c 等 (pattern) () 这个符号会记住所找寻到的字符串,是一个很实用的语法。第一个 () 内所找到的字符串变成 $1 这个变量或是 \1 变量,第二个 () 内所找到的字符串变成 $2 这个变量或是 \2 变量,以此类推下去。 b(\d)c 表示匹配的任何数字将存放与 $1 变量中 Python 语言本身不支持正则表达式,依赖 re 模块( python1.5 版本被引入)支持正则表达式。有搜索和匹配两种方法完成匹配模式。 re 模块常用的函数和方法有 complie 、 match 、 search 、 find 与 findall 等。在利用 re 进行匹配之前,模式必须被编译成 regex 对象。 表 4. Python 常用匹配模式 语法 说明 示例 . 匹配除换行符 \n 以外的任意字符 b.c 匹配 bac,bdc * 匹配前一个字符 0 次或多次 b*c 匹配 c ,或者 bbbc + 匹配前一个字符 1 次或多次 b+c 匹配 bc 或者 bbbc ? 匹配前一个字符 0 或 1 次 b?c 匹配 c 或者 bc {m} 匹配前一个字符 m 次 b{2}c 匹配 bbc {m,n} 匹配前一个字符 m 至 n 次 b{2,5}c 匹配 bbc 或者 bbbbc 匹配 匹配 b 或者 c \d 匹配数字 b\dc 匹配 b1c 等 \D 匹配非数字,等价于 b\Dc 匹配 bAc \s 匹配空白字符 b\sc 匹配 b c \S 匹配非空白字符 b\Sc 匹配 bac \w 匹配 b\wc 匹配 bAc 等 \W 等价于 b\Wc 匹配 b c \ 转义字符, b\\c 匹配 b\c ^ 匹配字符串开头 ^bc 匹配句首的 bc $ 匹配字符串末尾 bc$ 匹配以 bc 结尾的字符串 \A 仅匹配字符串开头 \Abc 匹配字符串开头的 bc \Z 仅仅匹配字符串末尾 bc\Z 匹配字符串末尾的 bc | 匹配左右表达式任意一个 b|c 匹配 b 或者 c 回页首 Perl 与 Python 中的线程 线程是一个单一的执行流程,它是所有程序执行过程中最小的控制单位,即能被 CPU 所调度的最小任务单元。在 Perl 中一个线程的生命周期包括创建,运行与退出这三个阶段。线程的运行过程与普通函数的执行类似,但新建线程的执行与当前线程的执行是并行的。 在 Perl 中创建线程有两种方法: 清单 2. 使用 threads 包的 create() 方法 use threads; sub say_hello { printf(Hello thread! @_.\n); return( rand(10) ); } my $t1 = threads-create( \say_hello, param1, param2 ); 清单 3. 使用 async{} 块创建线程 #!/usr/bin/perl use threads; my $t4 = async{ printf(Hello thread!\n); }; 对于线程的执行控制,有两种方式,一种是 join() ,一种是 detach() 。所谓 join() 就是在主线程中等待子线程的执行返回值,然后再继续执行后续代码,而在调用线程的 join() 方法之前,子线程与主线程的执行是分开的。而 detach() 则是告诉解释器主线程不关心子线程的执行结果,所以该子线程在完成任务之后就是自动退出,同时释放自己所占有的资源,而不用主线程再操心。 Perl 默认任何数据结构都不是共享的,任何新创建的线程都有当前数据的私有拷贝。如果要共享数据,必须使用 threads::shard 进行显示声明。 如: my $var :shared = 0; # use :share tag to define my @array :shared = (); # use :share tag to define my %hash = (); share(%hash); # use share() funtion to define 同时 Perl 线程还支持锁机制,可以使用 lock 方法实现线程间共享数据的锁机制。 Perl 中的 Thread::Semaphore 包为线程提供了信号量的支持, Thread::Queue 包为线程提供了线程安全的队列支持。更多使用读者可以自行查阅相关文档。 Python 提供了几个用于多线程编程的模块,包括 thread, threading 和 Queue 等。 thread 和 threading 模块允许程序员创建和管理线程。 thread 模块提供了基本的线程和锁的支持,而 threading 提供了更高级别,功能更强的线程管理的功能。 Queue 模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。 Python 的线程创建也有两种方式,一是利用 thread 模块的 start_new_thread() 函数来产生新线程。 import time import thread def timer(no, interval): cnt = 0 while cnt10: print 'Thread:(%d) Time:%s/n'%(no, time.ctime()) time.sleep(interval) cnt+=1 thread.exit_thread() def test(): #Use thread.start_new_thread() to create 2 new threads thread.start_new_thread(timer, (1,1)) thread.start_new_thread(timer, (2,2)) if __name__=='__main__': test() 另一种是创建 threading.Thread 的子类来包装一个线程对象。 class timer(threading.Thread): # derived from the class threading.Thread def __init__(self, num, interval): threading.Thread.__init__(self) self.thread_num = num self.interval = interval self.thread_stop = False def run(self): #Overwrite run() method, put what you want the thread do here while not self.thread_stop: print 'Thread Object(%d), Time:%s/n' %(self.thread_num, time.ctime()) time.sleep(self.interval) def stop(self): self.thread_stop = True Python 线程中也提供同步机制,可以利用 thrading 模块的 threading.RLock 和 hreading.Condition 可以分别实现锁机制和条件变量。 其中 acquire() 和 release() 方法分别获取和释放锁。 def run(self): global x lock.acquire() for i in range(3): x = x + 1 time.sleep(2) print x lock.release() 更多关于线程的内容,读者可查阅相关文档。 回页首 总结 本文从 Perl 和 Python 的起源,基本数据类型、控制结构、函数、包与模块、面向对象、正则表达式以及线程等方面进行了比较,从而给需要同时掌握这两种脚本语言的开发人员一定参考,以便更好的理解与应用。 参考资料 学习 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门 )准备的更多参考资料,查阅我们 最受欢迎的文章和教程 。 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程 。 随时关注 developerWorks 技术活动 和 网络广播 。 参考 Tutorial Perl 官方文档关注更多 Perl 动态。 参考 Perl Document 了解 Perl 基本语法。 参考 Tutorial Python 查看 Python 的官方文档。 讨论 加入 developerWorks 中文社区 , developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、 wiki 、群组、联系、共享和协作等社区功能的专业社交网络社区。
个人分类: 编程|2032 次阅读|0 个评论
[转载]Perl变量作用域和自定义函数小结
lingtingjiangla 2013-5-8 10:57
想MS用perl编程,先熟悉perl的语法,没必要深究,看 http://perldoc.perl.org/perlintro.html 就够了,主要熟悉变量、operator,file and I/O。 然后就是到MS看功能函数或模块,这才是重点。 1. 变量定义问题 Perl默认所有变量为包变量(Package variables),包变量为全 局变量,这意味着程序的任何其他部分,甚至在其他文件里定义的子程序,都能影响和修改变量的值。在一定程度上讲,这样是“不安全”的。 my变量: 自Perl 5以后,增加了新的非全局变量,也称为词法变量、私有变量、局部变量,或称为 my变量 。注意,不是local变量,local变量有另外的含义。例如 my $a; 就定义了一个局部变量$a, 它的作用域是当前块(Block),通俗地讲就是大括号里面,如果没有大括号就是从定义的地方开始到程序结束 。而local变量的意思,是 local变量 :local和my明显的不同,my创建局部变量,而local作用于包变量。具体地讲, local $x 实际做的事是: 存储包变量$x的当前值在一个安全的地方,然后用一个新值替换它,假如没有指定新值,就使用undef代 替。当控制离开当前块时,它也会恢复$x的旧值。 它影响的是包变量,这个包变量获取了本地值。但包变量总是全局的,local申明的包变量亦无例外。为了 显示其区别,请看这个: $lo = 'global'; $m = 'global'; A(); sub A { local $lo = 'AAA'; my $m = 'AAA'; B(); } sub B { print B , ($lo eq 'AAA' ? 'can' : 'cannot') , see the value of lo set by A.\n; print B , ($m eq 'AAA' ? 'can' : 'cannot') , see the value of m set by A.\n; } 结果会打印: B can see the value of lo set by A. B cannot see the value of m set by A. 发生了什么?在A函数里的local申明,给包变量$lo赋予了一个新的临时值AAA。旧值global会被存储起来,直到A返回,但在这点之前,A调用了B。B访问$lo的内容没有问题,因为$lo是包变量,包变量总是全局可见的,所以它能见到A设置的AAA值。 2. 自定义函数 用户函数又称子程序(Subroutine),在Perl中用下面的结构来定义用户函数:     sub 子程序名{       语句块;     } 这里的子程序名与变量的取名规则类似。 以显示欢迎词的程序为例:     sub say_hello{       print 你好,欢迎光临网上学园;     }   用户函数的定义可以位于程序的任何位置,比如说放在文件的未尾。如果两个子程序使用了相同的程序名, 后面的子程序将覆盖前面子程序。   用户函数中的变量默认为全局变量,与其他程序共享。   用户函数的调用:通过在子程序前加“”调用,可在任一表达式内调用。 子程序中可以再调用另外的子程序。   调用用户函数产生的结果称为返回值(return value)。返回值是每次调用函数中最后一个表达式的计算值。 以加法函数为例:     sub add_a_b{       $a+$b;     }   函数最后一条表达式为$a+$b,故返回值为$a+$b。以下是调用情况:     $a=5;     $b=6;     $c=add_a_b; #$c的值为11     $d=5*add_a_b; #$d的值为5*11即55   上述的函数功能与传统直接写在程序中没什么两样,如果加上参数传递就可以实现全新的功能了。 在Perl中,如果函数调用后面跟着一个用括号括起来的列表,则在函数调用期间该列表将被自动分配给以@_命名的特殊变量。 函数可以访问该变量,从而确定参数的个数及赋值。   仍以加法函数为例:     sub add_a_b{       $_〔0〕+$_〔1〕;     }     $c=add_a_b(5,6); #$c的值为11     $d=5*add_a_b(2,3); #d的值为5*5即25   如何改变参数的个数呢?我们可以用循环的方式来实现:     sub add_all{       $sum=0; #将sum初始化       foreach $_(@_) { #遍历参数列表        $sum+=$_; #累加每个元素       }       $sum; #返回sum即总和的值     }     $a=add_all(3,4,5); #$a的值为3+4+5即12     $d=2*add_all(1,2,3,4,5); #d的值为2*15即30   既然函数中的变量全为全程变量,那么上述程序中若调用程序中含有$sum变量时将替换,这不是我们所要的。 那么如何解决这一问题呢?   答案就是:使用局部变量, 使用local()操作符就可实现此功能。在上面的程序中,只需在第一行$sum=0;前加入:     local($sum);   当函数执行时,$sum的全程变量的值被保留起来,同时建立一个局部变量$sum。 用perl进行截断能收敛性测试(Convergence test)的例子,以供大家参考。 =================================================================== #!perl use strict; use MaterialsScript qw(:all); # 定义计算文档和结果输出文档 my $myDoc=$Documents{WO3.xsd};#要计算的模型文件 my $myStudyTable=Documents-new(energy-encut.std);#新建StudyTable存放计算结果,第一列是截断能,第二列是体系总能 my $mySheet=$myStudyTable-ActiveSheet; $mySheet-ColumnHeading(0)=Enegy Cutoff(eV); $mySheet-ColumnHeading(1)=Final Enegy(eV); # castep single calculation my $castep=Modules-CASTEP; my $startEnergy=200;#测试起点:200 eV my $endEnergy=500;#测试终点: 500 eV my $intervalEnergy=20;#测试点间隔 my $sumIteration=($endEnergy-$startEnergy)/$intervalEnergy; #循环计算每个截断能测试点的单点能 for(my $counter=0;$counter=$sumIteration;++$counter){ my $energyCutoff=$startEnergy+$intervalEnergy*$counter; $castep-ChangeSettings( Settings(Quality=Fine, UseCustomEnergyCutoff=Yes, EnergyCutoff=$energyCutoff));#这里设置截断能为测试点的截断能 $castep-Energy-Run($myDoc); $mySheet-Cell($counter,0)=$energyCutoff; #read final energy from castep output files #下面这一段提取castep文件中的总能,即Final energy后面的结果 foreach my $line (@{$Documents{WO3.castep}-Lines}) { if ($line=~/^Final energy/){ my $finalEnergy = substr($line,31,15); print $energyCutoff,\t,$finalEnergy,\n; $mySheet-Cell($counter,1)=$finalEnergy;#将总能结果放入StudyTable }} }
个人分类: 编程|1782 次阅读|0 个评论
perl判断元素是否在数组中的办法
JetLee 2013-4-23 21:37
数组中没有类似hash的简单exists函数 但可以用两种办法实现: print EXIST\n if $value~~@array; 或 print EXIST\n if grep {\$value == \$_ } @array;
16614 次阅读|0 个评论
perl/python与C语言的完美结合
热度 1 bigdataage 2013-4-13 20:59
Perl/Python与C语言的完美结合 其实很简单,不用考虑什么语言支不支持,不用考虑在Perl/Python潜入C的问题,什么都不用考虑。 一般使用Perl/Python处理文本,遇到计算和耗时的循环的时候,把这一部分用C来运行就是: Perl/Python - C - Perl/Python 把C代码编译成机器码,然后在Perl/Python中通过函数system()直接调用就是,通过命令行把参数传给C编译而成的机器码,C运行完以后把结果输出到一个文件,Perl/Python再去处理这个文件就是。总之就是以文件或命令行参数作为传递数据的中介。 其实很明显,这种方法对任何两种或多种语言混合编程都是适用的。
6444 次阅读|2 个评论
[转载]Perl 与 Python 之间的一些异同
ywmucn 2012-12-12 10:00
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-perl2python/index.html 张 颖 , 软件工程师, IBM 简介: Python 和 Perl 作为主流脚本语言中的成员,在语法等方面有很多相似之处,却又存在一定的差异。本文通过对这两种语言的比较,从而使得相关开发人员可以更深刻的了解和掌握这两种语言 关于 Perl 与 Python 的起源和特点 Perl 是 Practical Extraction and Report Language 的简称,由 1987 年 Larry Wall 创建,最初的目的是为了在 UNIX 上方便处理报表,经过长期的发展已经成为一种全功能的程序设计语言,当前最新的版本为 Perl5.14.1 , Perl 作为一种自由而强大的编程语言,其中心思想是: There's More Than One Way To Do It 。(不只一种方法來做这件事 ) ,即「 Tim Toady 」。作为一种 “ 胶水型 ” 语言,它具有强大的正则表达式和模式匹配功能以及灵活的数据结构,如动态数组、 Hash 等,在语法规则上借鉴了 C/C++ 、 Basic 、 Pascal 等语言,其不足之处在于存在一些冗余语法,代码的可读性较差。 Python 是一种基于面向对象的解析性交互式的开源编程语言,它起源于 1989 年末由 CWI (阿姆斯特丹国家数学和计算机科学研究所)的研究员 Guido van Rossum 创立, 1991 年初公开发行,其开源式的发行方式促进了 Python 的较快发展,目前已经形成了一个强大的社区力量。 Python 开发者的哲学是 “ 用一种方法,最好是只有一种方法来做一件事 ” 。 Python 具有简单易学、代码规范、语法简单、可移植性强、支持多平台、类库丰富等优点。 Perl 和 Python 都是开源的,但其哲学理念却刚好相反,因此常被人们将这两种语言放在一起进行比较。下面的篇章将从基本数据类型、控制流、函数、面向对象、文本处理等方面对这两种语言进行简单的比较和鉴别。 回页首 Perl 与 Python 的基本数据类型 脚本语言支持多种数据类型,变量无需事先申明,类型根据值来动态确定,一个变量在程序中可以根据上下文环境的不同存储不同类型的值。 Perl 支持的基本数据类型包括:标量、数组、哈希。在定义的时分别用 \$ 、 @ 、 % 表示。 1. 标量 (scalar) :标量是 Perl 中最简单的数据类型,大多数标量由数字或字符串组成。其中数字类型如整数、浮点数等,字符串有单引号和双引号内两种形式,对长度没有限制。两者的区别在于在单引号内 \n 不代表换行,而代表反斜线和 n 这两个字符,双引号内字符串则可以通过反斜线进行转义。字符串的操作符有 . 拼接操作符和 x 重复操作符等。 2. 数组 (Arrays) :数组用 @ 定义,如 my @array=("a","b","c","d"); 访问数组的元素用 \$array 。在 perl 中,数组也可以当做堆栈来处理,支持的操作符包括 pop 和 push , shft 和 unshift 。两组操作的区别在于前者对数组的尾部进行处理,而 shift 和 unshift 则针对数组的头部进行处理。 pop 得到的是数组的最后一个元素,如 pop ( @array ) = d ,如果数组为空,则返回 undef 。而 shift(@array)=a 。 3. 哈希:也称作关联数组,是根据关键码值 (Key value) 而直接进行访问的数据结构。用 % 定义,如 %my_hash=(“key1”=”23”,”name”=”zhang”,”age”=”24”) ,其中键以字符串表示, Hash 可以是任意大小。 与 hash 相关的函数有: keys :返回 hash 的键列表 my @keylist = keys %hash value :返回值列表 my @valuelist = values %hash each :用两个元素的列表返回键值对。 while((\$key,\$value)= each %hash) { print “\$key =\$value\n”; } Python 支持五种基本数据类型:数字 (Numbers) 、字符串 (String) 、列表 (List) 、元组 (Tuple) 和字典 (Dictionary) 。其中数字和字符串和 perl 中的标量对应,列表和数组对应,元组可以看做是不可变的列表,字典和 hash 对应。 1. 数字 (Numbers) : Python 支持五种基本数字类型,分别为 int( 有符号整数 ) 、 long( 长整数 ) 、 bool( 布尔值 ) 、 float( 浮点数 ) 、 complex( 复数 ) 。 2. 字符串 (String) : Python 与 Perl 一样也支持单引号和双引号字符串,但与 Perl 不同,转义字符在单引号中也会起作用。同时 python 还支持三引号字符串,它允许一个字符串跨多行,字符串中可以包含换行符,制表符以及其他特殊字符。三引号字符串常用于注释或者形成文档。字符串支持成员操作符 in , not in ,连接操作符 + 以及重复操作符 * 。 Python 字符串可以当做 list ,支持切片操作符 和反向索引。如下: 如 aString=”abcd” ;则 aString 的值为 a , aString =bc ,反向索引 aString =d 3. 列表 (List) : Pyhon 中的列表与 Perl 中的数组相对应。列表的定义使用 ,支持动态增加和删除元素以及切片操作。 增加元素可以使用 li.append(“test”),li.insert(2,”new”) 以及 li.extend( ) 删除元素使用 li.remove(“f”) 和 li.pop() 。但需要注意的是 remove 仅删除首次出现的,而 pop 会删除 list 最后的一个元素,然后返回删除的元素的值。 4. 元组 (Tuple) :元组和列表非常相似,但用()表示,并且元组是不可变的。 5. 字典 (Dictionary) : 字典跟 Perl 中的 hash 一样,定义了键值对之间一对一的关系,变量可以任意取名, Python 会在内部记录其数据类型。定义一个字典: D={“name”:”Jon”,”Family”:”SH”}, 字典中的 key 是不能重复的,并且大小写敏感,同时字典中的元素是无序的。字典也支持增删操作,往字典中添加元素 D =23, 删除元素 del D ,如果需要删除所有元素可以使用 D.clear(), 或者 del D 删除整个字典。 回页首 Perl 与 Python 的控制结构 在控制结果方面, Perl 较 Python 丰富,除了支持传统的 if 、 while 、 for 控制结构,还支持 until 、 unless 、 foreach 等, Python 的控制结构相对要少一些,但已经能够满足语言的要求。本节对这些控制结构进行详细比较。 If 控制结构: Perl 与 Python 都支持 if 、 if-else 、 if-else if- else 三种结构,两者在语法上基本类似,但与 Python 不同的是 Perl 中没有 boolean 类型,零和空表示 False ,其余表示 True ,而 Python 中除了 '' 、 "" 、 0 、 () 、      } 1. 基本语法: def functionName(arg1,arg2, ): statement 2. 内嵌函数: Python 支持内嵌函数 , 其方法是在外部函数的定义体内定义函数 , 但整个函数体都在外部函数的作用域之内 . def outfun(): def innerfun(): Print “inner fun test” print “out fun test” 返回值 使用 return 语句显示返回;如果没有 return ,默认返回最后一次运算的结果 使用 return 语句显示返回,没有 return 语句,默认返回为 None 。如果函数返回多个对象, python 把他们聚集起来并以一个元组返回。 调用 函数名(参数 1 ,参数 2 , ... ),如果声明在前,可以省略 。如果用户所定义的子过程与内置函数重名,则不能省略 。 如下例必须使用 chomp 调用: sub chomp{ print “it is my chomp\n”; } 1. 直接采用 函数名(参数 1 ,参数 2..... ) 2. 函数名(参数名 1= 值,参数名 2= 值 .......) 函数参数 1. 在子程序调用的后面加上被括号圈引的列表表达式即可,所有的参数都会自动存储为 @_ 中,其中第一个参数为 \$_ , 第二个参数存储 \$_ 。 2. 传递引用,在参数前加入 \ 表示为引用 1. 按照参数声明的关键字顺序直接传递; 2. 通过关键字参数 testFun ( par1=“2” , par2=“45” ) 3. 默认参数: Python 在传递参数的时候支持默认参数,规则是所有的位置参数必须出现在任何一个默认参数之前,如 def fun(arg1,defarg1=”var1”,defarg2=”12”), 如果在调用的时候没有给出参数值,则会使用默认值 4. 变长参数: 一种方法是利用非关键字可变长参数 , 可变长的参数元组必须在位置和默认参数之后 , 带元组的函数语法如下: def function_name( *vargs_tuple): function_body 其中 * 之后的形参将作为元组传递给函数。 另外一种方法是利用关键字变量参数,区别是在函数的参数变量里使用 ** 。 def dicVarArgs(arg1,arg2=”default”,**theRest): print 'formal arg1:', arg1 print 'formal arg2:', arg2 for eachXtrArg in theRest.keys(): print 'Xtra arg %s: %s' % \(eachXtrArg, str(theRest )) 回页首 Perl 与 Python 的包与模块 Perl 程序把变量和子程序的名称存贮到符号表中, Perl 的符号表中名字的集合就称为 Perl 包 (package) 。定义语法为: package mypack ;每个符号表有其自己的一组变量、子程序名,各组名字是不相关的,因此可以在不同的 Perl 包中使用相同的变量名,而代表的是不同的变量。 Perl 模块有两种来源,一种是随 Perl 发行版本一同打包的,另外就是用 CPAN 中下载的。 Perl 模块和包的概念并不清晰,两者有时可以混用。在程序中使用模块的操作称为导入模块;导入模块关键字 use ;如: use ModuleName ;模块被导入后,其中的子程序和变量就可以直接使用了;要取消一个已经导入了的模块,可以使用关键字 no ;如: no ModuleName 。 一个 .py 文件就是一个 python 模块。把一堆相关的 python 模块放在一个目录下,再加上一个 __init__.py 文件就构成了一个 python 包。在 Python 另一个程序中导入模块用 import module 或者 from module import * ,两者的区别在于: import module 会导入 module 这个模块里的所有标识,但是这些标识现在都在 module 名字空间下。 from module import * 也会导入 module 中所有标识,但是标识放到在当前名字空间里。 导入模块或包按下面顺序进行路径查找: 1. 当前目录 2. 环境变量 PYTHONPATH 所指的目录列表 3.python 解释器的安装目录 回页首 Perl 与 Python 中的 OOP 在 Perl 中,类是 Perl 包,含有提供对象方法的类,而方法是 Perl 的子程序,类名是其第一个参数,对象是对类中数据项的引用。在 Perl 中创建一个新类,首先要创建一个包,扩展名为 .pm, 在创建 perl 包的时候程序的最后一个必须为 "1;" ;否则该包不会被 Perl 处理。 清单 1. 创建 perl 的类和对象 package person; use strict; sub new { my \$class = shift(); print("CLASS = \$class\n"); my \$self = {}; \$self-{"name"} = shift(); \$self-{"sex"} = shift(); bless \$self, \$class; return \$self; } 1; 其中 new() 方法是对象的构造函数,是创建该类的对象实例必须被调用的,它返回该对象的引用。将类名与引用相结合称为 ”bless” 一个对象,其语法为: bless YeReference YeReference 是对被 ” 祝福 ” 的对象的引用, classname 是可选项,指定对象获取方法的包名,其缺省值为当前包名。也可以通过函数 bless 来声明一个构造函数。 sub new { my \$class = shift; my \$self = {}; bless \$self, \$class; return \$self; } 创建一个对象可以直接使用 new 关键字。 \$object = new Person( "mohand", "sam", 345); Perl 类中的方法就 Perl 的子函数,规定第一个参数为对象或者被引用的包,分为静态方法和虚方法。 虚方法通常首先把第一个参数 shift 到变量 self 或 this 中,然后将该值作普通的引用使用。一是通过该对象的引用 ( 虚方法 ) ,一是直接使用类名 ( 静态方法 ) 。如上例中如果类 Person 中有 getContactList 则可以直接使用 \$object-getContactList() 来调用该方法。 Perl 支持重载,当两个不同的类中含有相同的方法名称的时候,可以用 :: 操作符指定使用哪个类中的方法。 \$mess = Qava::grind("whole","lotta","bags"); Qava::grind(\$mess, "whole","lotta","bags"); 由于 Perl 采用了简单的、基于引用的垃圾回收系统。 Perl 跟踪对象的链接数目,当某对象的最后一个应用释放到内存池时,该对象就自动销毁。因此一般不需要定义类的析构函数。 Perl 通过数组 @ISA 支持继承。 package Employee; use Person; use strict; our @ISA = qw(Person); # inherits from Person 当子类继承父类的时候,继承了父类的所有方法,但子类也可以覆盖父类的方法。如加入 Employee 想覆盖父类的 getFirstName : #!/usr/bin/perl package Employee; use Person; use strict; our @ISA = qw(Person); # inherits from Person # Override helper function sub getFirstName { my( \$self ) = @_; # This is child class function. print "This is child class helper function\n"; return \$self-{_firstName}; } 1; 调用直接使用 \$firstName = \$object-getFirstName(); 如果要调用父类的 getFirstName ,则可以使用 \$object-Person::getFirstName(); 在 Python 中创建一个类的基本语法为 : class className(bases): classBody 参数 base 可以是一个单继承或者多继承的父类, object 是所有类的父类,位于类继承结构的最上层。类的构造函数为 __init__() ,其中构造函数中 self 会作为第一个默认的参数。而类的析构函数则是 __del__() ,访问类的方法和属性可以直接使用 . 访问符。 Python 不支持纯虚函数或抽象方法,并且声明和定义没有本质区别。一般或者 Python 类的属性可以通过 __dict__ 或者 dict ()访问。常见属性有 __name__ , __doc__ , __base__ , __dict__ 。 Python 中创建一个类的实例,不需要关键之 new ,直接使用类名 () 即可。如 c=myclass() 。 Python 不仅仅支持单继承和多继承,同时还支持方法的覆盖 . class P(object): def foo(self): print 'Hi, I am P-foo()' p = P() p.foo() Hi, I am P-foo() 现在创建 C 类 , 继承于 P class C(P): def foo(self): print 'Hi, I am C-foo()' c = C() c.foo() Hi, I am C-foo() 当从一个带构造器 __init()_ 的类派生,如果在子类中覆盖了 __init__() ,当子类被实例化时,基类的 __init__() 方法不会被自动调用。如果必须调用基类的构造方法,可以使用父类名 .__init__(self) 方法或者 super( 子类名, self).__init__() 。 如 def __init__(self): super(C, self).__init__() print "calling C's constructor" Python 类和实例支持一些内建函数,如 Issubclass(sub,sup) :判断一个类是另一个类的子类或子孙类; isinstance(obj1,obj2) :判定一个对象是否是另一个给定类的实例; 回页首 Perl 与 Python 的正则表达式 正则表达式是 perl 比较突出的一大特色, perl 中正则表达式有三种形式: 匹配: m/regexp/ (还可以简写为 /regexp;/ ,略去 m ) 替换: s/pattern/replacement/ ,为了语法的简化用 /pattern/replacement/ 表示,略去 s 转换: tr/charClass/substituteClass/ 这种形式包含一系列的字符 — /charClass — 同时把它们替换为 substituteClass 。 表 3. Perl 常用匹配模式 语法 说明 示例 . 匹配除换行符以外的所有字符 b.c 匹配 bac x? 匹配 0 次或一次 x 字符串 b?c 匹配 c 或者 bc x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数 b*c 匹配 c 或者 bbc x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数 b+c 匹配 bc 或者 bbc .* 匹配 0 次或一次的任何字符 b.*c 匹配 bgdc 等 .+ 匹配 1 次或多次的任何字符 b.+c 匹配 bgc 等 {m} 匹配刚好是 m 个 的指定字符串 b{5}c 匹配 bbbbbc {m,n} 匹配在 m 个 以上 n 个 以下 的指定字符串 b{1,2} 匹配 b 或者 bb {m,} 匹配 m 个 以上 的指定字符串 b{2,} 匹配 bb 或者 bbb 等 内的字符 b c 匹配 bdc 匹配不符合 c 匹配 bAc 匹配所有数字字符 b c 匹配 b1c 匹配所有小写字母字符 b c 匹配 bac ^ 匹配字符开头的字符 ^perl 匹配以 perl 开头的字符 \$ 匹配字符结尾的字符 perl\$ 匹配以 perl 结尾的字符 \d 匹配一个数字的字符,和 语法一样 b\dc 匹配 b1c \D 非数字,其他同 \d b\Dc 匹配 bAc \w 英文字母或数字的字符串,和 语法一样 b\wc 匹配 b1c 等 \W 非英文字母或数字的字符串,和 语法一样 b\Wc 匹配 b c \s 空格,和 语法一样 b\sc 匹配 b c \S 非空格,和 语法一样 b\Sc 匹配 bac 等 \b 匹配以英文字母 , 数字为边界的字符串 \bbc\b 匹配 bc 但不匹配 bca \B 匹配不以英文字母 , 数值为边界的字符串 sa\B 将匹配 sand 和 Sally 等字符串,而不能匹配 Melissa. a|b|c 匹配符合 a 字符 或是 b 字符 或是 c 字符 的字符串 abc 匹配含有 abc 的字符串 匹配 a 或者 b 或者 c 等 (pattern) () 这个符号会记住所找寻到的字符串,是一个很实用的语法。第一个 () 内所找到的字符串变成 \$1 这个变量或是 \1 变量,第二个 () 内所找到的字符串变成 \$2 这个变量或是 \2 变量,以此类推下去。 b(\d)c 表示匹配的任何数字将存放与 \$1 变量中 Python 语言本身不支持正则表达式,依赖 re 模块( python1.5 版本被引入)支持正则表达式。有搜索和匹配两种方法完成匹配模式。 re 模块常用的函数和方法有 complie 、 match 、 search 、 find 与 findall 等。在利用 re 进行匹配之前,模式必须被编译成 regex 对象。 表 4. Python 常用匹配模式 语法 说明 示例 . 匹配除换行符 \n 以外的任意字符 b.c 匹配 bac,bdc * 匹配前一个字符 0 次或多次 b*c 匹配 c ,或者 bbbc + 匹配前一个字符 1 次或多次 b+c 匹配 bc 或者 bbbc ? 匹配前一个字符 0 或 1 次 b?c 匹配 c 或者 bc {m} 匹配前一个字符 m 次 b{2}c 匹配 bbc {m,n} 匹配前一个字符 m 至 n 次 b{2,5}c 匹配 bbc 或者 bbbbc 匹配 匹配 b 或者 c \d 匹配数字 b\dc 匹配 b1c 等 \D 匹配非数字,等价于 b\Dc 匹配 bAc \s 匹配空白字符 b\sc 匹配 b c \S 匹配非空白字符 b\Sc 匹配 bac \w 匹配 b\wc 匹配 bAc 等 \W 等价于 b\Wc 匹配 b c \ 转义字符, b\\c 匹配 b\c ^ 匹配字符串开头 ^bc 匹配句首的 bc \$ 匹配字符串末尾 bc\$ 匹配以 bc 结尾的字符串 \A 仅匹配字符串开头 \Abc 匹配字符串开头的 bc \Z 仅仅匹配字符串末尾 bc\Z 匹配字符串末尾的 bc | 匹配左右表达式任意一个 b|c 匹配 b 或者 c 回页首 Perl 与 Python 中的线程 线程是一个单一的执行流程,它是所有程序执行过程中最小的控制单位,即能被 CPU 所调度的最小任务单元。在 Perl 中一个线程的生命周期包括创建,运行与退出这三个阶段。线程的运行过程与普通函数的执行类似,但新建线程的执行与当前线程的执行是并行的。 在 Perl 中创建线程有两种方法: 清单 2. 使用 threads 包的 create() 方法 use threads; sub say_hello { printf("Hello thread! @_.\n"); return( rand(10) ); } my \$t1 = threads-create( \say_hello, "param1", "param2" ); 清单 3. 使用 async{} 块创建线程 #!/usr/bin/perl use threads; my \$t4 = async{ printf("Hello thread!\n"); }; 对于线程的执行控制,有两种方式,一种是 join() ,一种是 detach() 。所谓 join() 就是在主线程中等待子线程的执行返回值,然后再继续执行后续代码,而在调用线程的 join() 方法之前,子线程与主线程的执行是分开的。而 detach() 则是告诉解释器主线程不关心子线程的执行结果,所以该子线程在完成任务之后就是自动退出,同时释放自己所占有的资源,而不用主线程再操心。 Perl 默认任何数据结构都不是共享的,任何新创建的线程都有当前数据的私有拷贝。如果要共享数据,必须使用 threads::shard 进行显示声明。 如: my \$var :shared = 0; # use :share tag to define my @array :shared = (); # use :share tag to define my %hash = (); share(%hash); # use share() funtion to define 同时 Perl 线程还支持锁机制,可以使用 lock 方法实现线程间共享数据的锁机制。 Perl 中的 Thread::Semaphore 包为线程提供了信号量的支持, Thread::Queue 包为线程提供了线程安全的队列支持。更多使用读者可以自行查阅相关文档。 Python 提供了几个用于多线程编程的模块,包括 thread, threading 和 Queue 等。 thread 和 threading 模块允许程序员创建和管理线程。 thread 模块提供了基本的线程和锁的支持,而 threading 提供了更高级别,功能更强的线程管理的功能。 Queue 模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。 Python 的线程创建也有两种方式,一是利用 thread 模块的 start_new_thread() 函数来产生新线程。 import time import thread def timer(no, interval): cnt = 0 while cnt10: print 'Thread:(%d) Time:%s/n'%(no, time.ctime()) time.sleep(interval) cnt+=1 thread.exit_thread() def test(): #Use thread.start_new_thread() to create 2 new threads thread.start_new_thread(timer, (1,1)) thread.start_new_thread(timer, (2,2)) if __name__=='__main__': test() 另一种是创建 threading.Thread 的子类来包装一个线程对象。 class timer(threading.Thread): # derived from the class threading.Thread def __init__(self, num, interval): threading.Thread.__init__(self) self.thread_num = num self.interval = interval self.thread_stop = False def run(self): #Overwrite run() method, put what you want the thread do here while not self.thread_stop: print 'Thread Object(%d), Time:%s/n' %(self.thread_num, time.ctime()) time.sleep(self.interval) def stop(self): self.thread_stop = True Python 线程中也提供同步机制,可以利用 thrading 模块的 threading.RLock 和 hreading.Condition 可以分别实现锁机制和条件变量。 其中 acquire() 和 release() 方法分别获取和释放锁。 def run(self): global x lock.acquire() for i in range(3): x = x + 1 time.sleep(2) print x lock.release() 更多关于线程的内容,读者可查阅相关文档。 回页首 总结 本文从 Perl 和 Python 的起源,基本数据类型、控制结构、函数、包与模块、面向对象、正则表达式以及线程等方面进行了比较,从而给需要同时掌握这两种脚本语言的开发人员一定参考,以便更好的理解与应用。 参考资料 学习 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门 )准备的更多参考资料,查阅我们 最受欢迎的文章和教程 。 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程 。 随时关注 developerWorks 技术活动 和 网络广播 。 参考 Tutorial Perl 官方文档关注更多 Perl 动态。 参考 Perl Document 了解 Perl 基本语法。 参考 Tutorial Python 查看 Python 的官方文档。 讨论 加入 developerWorks 中文社区 , developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、 wiki 、群组、联系、共享和协作等社区功能的专业社交网络社区。 关于作者 张颖,软件工程师,任职于 CSTL Director Build/BVT team ,从事 Build/BVT 相关方面的工作
个人分类: 脚本|2152 次阅读|0 个评论
Perl 6 解释器的正式版什么时候发布?
bigdataage 2012-12-5 10:26
Perl 6 解释器的正式版什么时候发布? (第4次修改, Final Version) Perl 6 貌似快发布正式版了: Perl 6 是对perl 5的重大改进, 这个计划从2000年就开始了, 但直到现在还没有释放正式版,主要是因为perl没有大公司的支持,完全靠志愿者组成的社区进行开发, 进展缓慢,perl6解释器一直没有实现,但最近好像有了较快的发展, Rakudo (Perl6解释器的一种实现)实现了大部分功能: http://perl6.org/compilers/features 目前有8项功能只是部分实现(2013-03-18),12项功能还没有实现,主要集中在并行计算这一块: 1. partially implemented : Unicode properties Variable interpolation LoL Buf, buf, utf8 Native operators Logic cascade (andthen, orelse) Precedence and associativity of new operators Feed operators 2. not yet implemented : Labeled loops Matching streams NFG as default, StrPos/StrLen Compact arrays Shaped arrays/hashes Basic module versioning Delayed declarations Basic threads async blocks is atomic Synchronization Parallelized hypers and junctions Further Reading and References: http://perl6.org/ http://developinthecloud.drdobbs.com/author.asp?section_id=2283doc_id=251836 http://en.wikipedia.org/wiki/Perl_6 http://baike.baidu.com/view/4380142.htm http://ar.newsmth.net/thread-af3a933fa0f2c6.html 据说Perl6会在圣诞节那天发布,但2012年的圣诞节已经过去了,Perl6解释器的正式版还没发布,希望能在2013年的圣诞节发布。 有可能是在2014年的圣诞节发布Perl 6 解释器的正式版:perl 6.0.0 在文本处理方面,perl的确比python要方便、要强大, Unmatched power for text processing and scripting, 这一点Larry Wall还是没有吹牛。 希望perl 6 能尽快实现其所用功能,特别是关于Concurrency的,几次想离开perl, 改用python, 都看在perl 6 的面子上算了, perl在TIOBE上的排名持续下滑,Larry Wall也不想点办法,不知道干什么去了! Links: http://www.perl.org/ http://perl6.org/ http://www.cpan.org/ http://perl11.org/ http://www.wall.org/~larry/ https://github.com/Perl/perl5 https://github.com/perl6 https://github.com/rakudo/rakudo 2014年3月 Larry Wall 说“ 我们打算在一年左右发布一个Perl 6的产品级版本。” 【独家专访】Perl发明者首次来华:将在OSTC大会分享其编程人生。详见: http://www.csdn.net/article/2014-03-19/2818848-CSDN-OSTC-2014-Larry-Wall-interview 所以 Perl 6 应该会在2015年发布!
5697 次阅读|0 个评论
使用perl将当前目录中子目录下的相应文件拷贝到一个文件夹中
热度 1 kangyu 2012-11-23 13:34
对于分类的文件夹下又有子文件夹,如果要将所有子文件夹下的相应文件取出来,通过切换文件夹,不断Ctrl+C和Ctrl+V是一种让手疼的办法。而用perl就只要将下面的脚本放到当前文件夹下,在命令行中执行就可以替代手疼的方法。下面是代码,希望高手们有更好的方法和大家分享。 ############################# #!/usr/bin/perl -w # 当前文件夹下所有的文件存入数组中 my @allFiles=glob(*); # 执行循环,每个文件都要判断是否为目录 foreach my $subdir(@allFiles) { next unless (-d $subdir); # 如果是目录则打开目录句柄 opendir(DIR, $subdir); # 从目录句柄中读取目录中的文件 @fileName=readdir(DIR); # 关闭目录句柄 closedir DIR; # 判断打开是否成功 print Dir is: $subdir:\n; # 进入每个目录中,loop所有的文件,然后对文件进行处理。 # .\\是Windows系统中当前目录 # 如果是Linux系统下,则当前目录用”./ chdir(.\\$subdir); foreach my $file(@fileName) { # 如果这些文件名能够匹配,则将这个文件cp到特定文件夹中 if ($file =~ /$pattern/) { print $file, \n; # copy相应文件到文件夹D:/test/中 `cp $file D:\\test\\` } else { next; } } # 还原上一级目录 chdir(..\\); } ###############################
个人分类: perl|11493 次阅读|1 个评论
Install Perl Modules on Windows
chhli3 2012-11-13 10:24
之前在安装模块的时候,系统总是提示“找不到相应的文件或路径”,主要原因是:要想安装该模块,必须进入该模块的文件夹,然后运行perl Makefile.PL。之后系统可能会提示,需要安装c编译器,下面将详述具体步骤: 1、在线安装c编译器。电脑要联网,运行命令:ppm install MinGW,然后等待安装。 2、从CPAN上下载要安装的模块,解压后,键盘“Win+R”,输入“cmd”,回车,在命令行窗口下,进入解压后的模块的文件夹内,运行 perl Makefile.PL ,回车,运行dmake,回车,运行dmake test ,回车,运行dmake install,然后等待安装就好了。(当然这是一般的步骤,要安装模块,解压后应该首先看readme文件。) 另外,如果没联网(但是有c编译器),也可离线安装,具体请参见http://download.csdn.net/detail/guojiajia/3633165
个人分类: Perl|3604 次阅读|0 个评论
GBrowse安装配置指南(一)——GBrowse的安装
snakesgun 2012-10-14 10:19
GBrowse安装配置指南(一)——GBrowse的安装
GBrowse是GMOD(Generic Modal Organism Database)组织发展的一种基于Perl语言的生物数据整合展示的线上工具,该工具功能丰富,可以对目前已知的绝大部分生物数据进行可视化展示,并且其强大的可扩展性可以集成许多差价,如限制性内切酶位点分析,UCSC-Blat,primer3等诸多功能。另外由于该软件是基于Perl语言发展出来的,其对大规模字符串为主的生物学数据具有非常明显的优势。不过碍于脚本语言的执行效率以及资源占有情况,需要对服务器平台进行合理设置以保证整个系统的正常运行。 下面我就首先来介绍一下GBrowse的安装过程。 以CentOS操作系统为例,基于RPM文件系统的Linux操作系统均适用 首先需要在操作系统上安装保证GBrowse正常运行所需要的软件包,如果已经安装,请直接进入第二步 1. 安装支持软件包(需要获得root权限) gcc编译器 # yum install make gcc gcc-devel gmp-devel 安装文件获取功能 # yum install wget git 安装apache2服务 # yum install httpd mod_fcgid fcgi-perl 安装所需求的Perl模块(建议使用CPAN安装) # CPAN install GD Module::Build IO::String Capture::Tiny CGI::Session JSON JSON::Any libwww::perl DBD::SQLite File::NFSLock Net::SMTP::SSL Crypt::SSLeay Net::SSLeay Template::Toolkit Bio::Perl Bio::Graphics GD DBD::mysql GD::SVG DBI DBD::Pg Digest::MD5 Statistics::Descriptive Template 安装数据库软件 # yum install mysql mysql-server mysql-devel # yum install sqlite sqlite-devel # yum install postgresql postgresql-server 可选选项 # yum install inkscape (用于生成矢量图) 需要注意的是Perl模块中的BioPerl以及Bio::Graphics是关键,一定要安装好. 2.在完成以上各个软件包的安装之后,在root权限下运行 # perl -MCPAN -e 'install Bio::Graphics::Browser2' 当所有的安装过程结束之后,进入root权限,启动apache服务 # service httpd start 然后打开浏览器,在地址栏中键入 http://localhost/gbrowse2 进入以下界面,证明安装成功! 可以点击其中的 http://your.host/cgi-bin/gb2/gbrowse/yeast 进入demo展示 如果不能正常显示则需要关闭linux系统的selinux服务 修改/etc/selinux/config文件,设置SELINUX=disabled ,然后重启服务器即可。
个人分类: BioPerl|6222 次阅读|0 个评论
Perl中数组&哈希的使用
jiewencai 2012-10-4 13:57
一、数组 1.创建 a.普通数组的创建:@array = qw /a b c/; @ array= ( "a","b","c" ) ; @array=(1,2,3); b.匿名数组的创建: $ array_ref = ; $array_ref= ; 数组的引用的创建:$array_ref = /@array; c.使用slice方法创建:@array = @array_all ; @array=(split /\s+/ ,$scalar) ; 2.使用 a. $array , $array ; @array;# 哎,科学网的编辑器有问题,此处array前少了"$"符号。下文的黑体所在行的字 符都无法正确显示,请注意辨别。 b.$array_ref- ; ${ $array_ref } ;#使用单个元素. @{$array_ref};#使用整个数组. c.@array ;#使用数组中索引值为1、5、0、7的元素,并按该顺序返回. 注意区别 @ arrray= ( ... ) 和 $ array_ref= ; 二、哈希 1.创建 a.普通哈希的创建:$hash{a}="abc"; $hash{b}="def"; % hash= ( a="abc",b="def" ) ; b.匿名哈希的创建: $ hash_ref = { a="abc",b="def" } ; 哈希的引用的创建:$hash_ref=/%hash; c.使用slice方法创建:@pleyers = qw/barney fred dino/; @bowling_scores=(195,205,30); @score { @players } =@{bowling_scores}; #此处的@score{@players}等价于( $score{barney},$score{fred},$score{dino});即同时对%score 这个哈希的三个元素赋值; 注意区别 % hash= ( ... ) ; $ hash_ref= { ... } ; 2.使用 a.$hash{a}; %hash b.$hash_ref-{a}; ${$hash_ref}{a};#使用单个元素; %{$hash_ref};#使用整个哈希; c.@score { @players}=@{bowling_scores } ;#看作($score{barney} , $score{fred} , $score{dino}); 参考资料:1. perl---(数组和哈希)引用 2. perl 中散列数组的使用 3.《perl语言入门》的“array slice”、“hash slice”;
个人分类: Perl|9851 次阅读|0 个评论
[转载]perl map 函数详解
jiewencai 2012-9-30 13:44
转载自 http://techbbs.zol.com.cn/1/84_308.html (一)map函数 map BLOCK LIST map EXPR, LIST map函数对LIST里的每个元素按BLOCK或EXPR进行计算,遍历LIST时,临时将LIST里的每个元素赋值给$_变量。map对每次的计算返回一个结果列表,它在列表上下文里计算BLOCK或EXPR。每个LIST元素可能在输出列表里产生0个,1个,或多个元素。 (仙子注:上文是说遍历每个LIST元素时产生一个结果列表,而不是说总的map结果是个列表,不要搞混了哦。) 在标量上下文里,map返回结果列表的元素数量。在HASH上下文里,输出列表(a,b,c,d...)会变成这样的形式: ( a =; b, c =; d, ... )。假如输出列表的元素数量非对称,那么最后的hash元素的值就是undef了。 避免在BLOCK或EXPR里修改$_,因为这会修改LIST里的元素。另外,避免使用map返回的的列表作为左值,因为这也会修改LIST里的元素。(所谓左值,就是在某个表达式左边的变量。) (二)Map vs. grep vs. foreach map跟grep一样,从数组里选择元素。下列2句是一样的: @selected = grep EXPR, @input; @selected = map { if (EXPR) { $_ } } @input; 另外,map也是foreach陈述的特殊形式。假如@transformed数组当前未定义或为空,那么下列2句亦相等: foreach (@input) { push @transformed, EXPR; } @transformed = map EXPR, @input; 通常,用grep来从数组里选择元素,用map来从数组里转换元素。当然,数组处理也能使用标准的循环语句来完成(foreach, for, while, until, do while, do until, redo)。 (三)map用法示例 1. 转换文件名为文件大小 @sizes = map { -s $_ } @file_names; -s是个文件测试操作符,它返回某个文件的size。所以上面这句就返回@file_names数组里每个文件的大小,结果也是个数组。 2. 转换数组到hash:找到某个数组值的索引 代替重复的搜索数组,我们可以用map来转换数组到hash,并通过hash关键字来进行直接查找。如下的map用法相对于重复的数组搜索,更简单高效。 @teams = qw(Miami Oregon Florida Tennessee Texas Oklahoma Nebraska LSU Colorado Maryland); %rank = map { $teams , $_ + 1 } 0 .. $#teams; print "Colorado: $rank{Colorado}n"; print "Texas: $rank{Texas} (hook 'em, Horns!)n"; 打印结果是: Colorado: 9 Texas: 5 (hook 'em, Horns!) 上述code容易理解哦,0 ..$#teams 是个列表,$#teams代表@teams最后一个元素的下标值(这里是9),所以这个列表就是0-9这几个数了。map遍历上述列表,将每个列表元素临时设置为$_,并对$_在中间的{}里进行计算;{ $teams , $_ + 1 },这里每次计算后返回一个2元素的列表,列表结果是某个数组值和对应的数组下标加1,明白了呀? 由于对每个LIST元素进行计算时,都产生一个2元素的列表,所以总的map结果就可看作一个hash了。hash关键字就是数组元素,hash值是对应的数组下标加1。 3. 转换数组到hash:查找拼错单词 转换数组到hash是map的最普遍用法。在本示例里,hash的值是无关紧要的,我们仅检查hash关键字是否存在。 %dictionary = map { $_, 1 } qw(cat dog man woman hat glove); @words = qw(dog kat wimen hat man gloove); foreach $word (@words) { if (not $dictionary{$word}) { print "Possible misspelled word: $wordn"; } } 打印结果是: Possible misspelled word: kat Possible misspelled word: wimen Possible misspelled word: gloove 看看第1句的map用法,它跟前面示例里的差不多哦。qw()这里是个列表,map对这个列表里的每个元素进行{ $_, 1 }计算,每次计算的结果返回一个2元素的列表,换句话说,就是%dictionary的key和value呀。所以map最终的结果就是一个hash了,关键字是qw()里的元素,值总是1,无关紧要的。 然后下面的foreach语句就容易了哦,如果@words里的元素不构成%dictionary的关键字的话,就打印一条出错消息。如果把%dictionary看成标准字典的话,那么就可用它来检验你自己的@words字库里是否有错字了呀。 4. 转换数组到hash:存储选中的CGI参数 hash通常是存储传递给程序或子函数的参数的最便利的方法,而map通常是创建这个hash的最便利的方法。 use CGI qw(param); %params = map { $_, ( param($_) ) } grep { lc($_) ne 'submit' } param(); 这里你可能要了解一下CGI模块的基本知识哦。param()调用返回CGI参数名的列表;param($_)调用返回指定的CGI参数名的值。假如param($_)返回某个CGI参数的多个值,那么( param($_) ) 只取第一个值,以便hash仍被良好定义。 上述code的意思是,将param()的结果作为输入列表,它的元素是多个CGI参数名,然后从这些参数名里grep出参数名不等于'submit'的,结果是一个临时列表,map的{ $_, ( param($_) ) }语句再次遍历这个临时列表,并获取到参数名,和对应的参数值,将结果赋给%params。所以%params里就存储了页面提交过来的,除了submit外的其他CGI参数名和参数值(只取第1个)。 很巧妙的用法,是不是?它结合用了map和grep,使code显得很简洁。 (话外一句:偶在Cornell读书时,偶的师兄们很喜欢这种用法,他们往往在中间多次使用map,grep,sort进行堆叠,结果产生的code也许高效,但不容易看懂。读这样的code时,你要从右往左读,因为右边表达式产生的临时列表,是左边表达式的输入条件。) 5. 产生随机密码 @a = (0 .. 9, 'a' .. 'z'); $password = join '', map { $a } 0 .. 7; print "$passwordn"; 每次运行它会得到不同的结果,但长度总是8位,由0 .. 7这个决定。如下是可能的输出: y2ti3dal 它是个随机值,也许你能用它来做密码。 这里,需要先明白几个函数,rand产生一个随机值,它后面的@a其实是个标量哦,表示@a数组的长度,rand @a的结果可能是个小数,所以再用int函数来取整。int rand @a的结果是个整数,它;=0但小于@a的长度。所以$a 就表示从@a数组里随机取出一个字符了。0..7表示总共取8次,返回的结果再用join连接起来,就构成一个8位随机密码了呀。 当然,(0 .. 9, 'a' .. 'z')数组元素太少了,你可以修改它,使其包含大小写字符,数字和标点符号,这样密码强度就高些。 6. 从数组元素里剥离数字 已经说了哦,不要在EXPR里修改LIST值。如下做法是不好的: @digitless = map { tr/0-9//d; $_ } @array; 它虽然从数组元素里剥离了数字,但同样破坏了该数组,:( 如下做法是good: @digitless = map { ($x = $_) =~ tr/0-9//d; $x; } @array; 它将tr的结果赋给临时变量$x,并返回$x的值,这样就保护数组了呀。 7. 打印"just another perl hacker",让你晕到家 print map( { chr } ('10611711511603209711011111610410111' . '4032112101114108032104097099107101114') =~ /.../g ), "n"; 打印的结果是: just another perl hacker chr函数将单个数字转换到相应的ASCII字符。()=~/.../g语法以3个数字长度为单位,分割数字串到新的串列表。 比较无聊的用法,还不如用pack()和unpack(),:P 8. 转置矩阵 @matrix = ( , , ); foreach $xyz (@matrix) { print "$xyz-; $xyz-; $xyz-; n"; } @transposed = map { $x = $_; } 0 .. $#matrix ]; } 0 .. $#{$matrix }; print "n"; foreach $xyz (@transposed) { print "$xyz-; $xyz-; $xyz-; n"; 打印结果是: 123 456 789 147 258 369 这里稍微有点复杂哦,让我们分2步看看。 @matrix = ( , , ); foreach $xyz (@matrix) { print "$xyz-; $xyz-; $xyz-; n"; } 这里不难明白,( , , ) 是个数组,它的每个元素又是个匿名数组,这样在$xyz遍历数组时,$xyz-; ,$xyz-; ,$xyz-; 就可以访问到匿名数组里的元素了。所以会打印出: 123 456 789 @transposed = map { $x = $_; } 0 .. $#matrix ]; } 0 .. $#{$matrix }; 这里复杂点,0 .. $#{$matrix }是个列表,$#{$matrix }表示$matrix 这个匿名数组的最大下标值,0 .. $#{$matrix }表示矩阵的横向。$x = $_;这里将$_的值赋给$x,为什么呢?因为它后面又有个map嘛,$_的值会改变的,所以要先存储起来。外围的map返回的值是 匿名数组形式返回。 这里先纵再横,就把矩阵值置换了一下。所以返回的结果列表@transposed就包含置换后的矩阵了哦。 是否有点糊涂?那举例看看。这样看可能好点: , , 外围的map遍历时,先是横向下标遍历,停留在横向0位。然后第二个map,就是纵向下标遍历了,它要遍历所有纵向下标,这样在横向0位,就先返回 的列表了,然后在横向1位,又返回 的列表,最后在横向2位,返回 的列表。 还不明白呀?那偶也讲不清了,自己多想想,:P 9. 查找质数:警示用法 foreach $num (1 .. 1000) { @expr = map { '$_ % ' . $_ . ' ' } 2 .. int sqrt $num; if (eval "grep { @expr 1 } $num") { print "$num " } } 打印结果是: 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 ... 该code能工作,但它如此麻烦,违背了程序最基本的明晰法则。用如下直观的code代替它就可以了呀: CANDIDATE: foreach $num (1 .. 1000) { foreach $factor (2 .. int sqrt $num) { unless ($num % $factor) { next CANDIDATE } } print "$num "; }
个人分类: Perl|3437 次阅读|0 个评论
代码欣赏:gtf2bed
bioseq 2012-9-4 11:12
代码欣赏:gtf2bed
PS:PERL尚未成功,同志仍需努力! 更多内容 http://www.seq.cn/forum.php?mod=viewthreadtid=2735extra=page%3D1
5880 次阅读|0 个评论
perl 的各种排序汇总
liujd 2012-8-31 19:05
1,数值排序 = (1)一维数组排序 @array = (8.0, 8.1, 3.2, 12, 4, 16); @array=(sort { $a = $b } @array);//递增 @array=(sort { $b = $a } @array);//递减反序要求是只需要把$a和$b交换即可 print join(' ',@array); (2)二维数组排序 @list = (sort{$a- = $b- } @list); 按照行为单位排序,排序的依据是第二列。 2,ASCII排序 cmp 具体写法:sort { $a cmp $b } @languages 简单写法:sort @languages 如果对一个数组进行sort排序,那么默认的就是ASCII排序 3,哈希数组的排序 $list ={age=20,money=33}; $list ={age=50,money=23}; $list ={age=20,money=123}; $list ={age=10,money=13}; @list=sort {$a-{age} = $b-{age} or $a-{money} = $b-{money}} @list; 多个关键字之间排序。
个人分类: perl|5872 次阅读|0 个评论
[转载]perl 替换
liujd 2012-8-7 10:59
转载 1、使用s///进行替换,s///只能修改被称为左值(lvalue)的数据。s/Barney/Fred/; #Barney 被Fred 替换掉。如果没有匹配上,则什么也不会发生,此变量也不会有任何更改。 可以在替换过程中使用变量$1,$2。 s///会返回一个Boolean 值。如果成功替换则返回true;否则返回false。 2、s///只进行一次替换,无论是否还有地方还能匹配上。修饰符/g 要求s///将不相重叠的所有匹配上的部分都进行替换。 s/\s+/ /g; 将多个空格用单个空格替换掉 s/^\s+//; #将开头的空白去掉 s/\s+$//; #将结尾的空白去掉 s/^\s+|\s+$//g; #将开头,结尾的空白去掉 3、我们也可以改变s///的分隔符。但这里使用了3个分隔符,因此有些不同。 虽然井号在Perl 中也表示注释的开始,但在替换(s)之后,由于Perl 期望一个分界符,因此不会将#号当作注释的提示符处理。 如果使用的是配对的字符,也就是说其左字符和右字符不的,则必需使用两对:一对存放模式,一对存放替换的字符串。此时,分隔符甚至可以是不同的。事实上,分隔符还可以使用普通的符号(非配对的)。下面三例是等价的: s{fred}{barney}; = s (barney); = sfred#barney#; 4、除了/g 修饰符外,替换操作中还可以使用/i, /x, 和/s。我们这里虽说的是像“/i”这样的修饰符,但分隔符有可能不是/。 5、我们也可以通过使用绑定操作符改变s///的替换目标: $file_name =~ s#^.*###s; 6、希望确保被替换的字符串均是大写的,这在Perl 中只需使用某些修饰符就能办到。\U 要求紧接着的均是大写。也可以要求后面的均为小写:\L。 $_ =“I saw Barney with Fred.”; s/(fred|barney)/\U$1/gi; #$_现在是“I saw BARNEY with FRED.” s/(fred)|barney/\L$1/gi; #$_现在是“I saw barney with fred.” 默认时,会影响到剩余的(替换的)字符串。可以使用 \E 来改变这种影响: s/(\w+) with (\w+)/\U$2\E with $1/I; #$1 现在是“I saw FRED with barney.” 使用小写形式时(\l 和\u),只作用于下一个字符。 $a="I saw FRED with barney"; $a =~ s/(fred|barney)/\u$1/ig; print $a; 这里面$1最后内容是barney?为什么不是fred?是不是最后匹配的放在了$1里面? 答:不是,因为这个模式只要求匹配的第一个字母大写显示,FRED已经是大写了,所以其余没动。 混合使用他们:如使用\u 和\L 表示“第一个字母大写,其它字母均小写”。\L 和\u 可以按任意顺序出现,在这两种情况下都是将第一个字母大写,其余的小写。 这些在替换中出现的大小写转换的修饰符,也可在双引号中使用。
个人分类: perl|3315 次阅读|0 个评论
BioPerl使用手册 第一弹—Bio::SeqIO篇
热度 2 snakesgun 2012-6-21 15:57
1. 让我们开始吧 为了让第一次使用本手册的同志们在刚开始就有成功的喜悦,这里给出一个例子,大家准备好自己手中的 fasta 文件吧! 请在文本编辑器中写入如下程序,并在终端运行: #! /usr/bin/perl –w use strict; use Bio::SeqIO; my $file = “*********”; # Please use your path to replace the starts my $seqio_object = Bio::SeqIO - new(-file = $file); my $seq_obj = $seqio_object - next_seq; printf “$seq_obj\n”; 如果你成功键入了以上程序并且没有报错发生,那么屏幕上面就会正常显示出你的 fasta 序列。那么恭喜你,你已经成功调用了 BioPerl 的模块,并且完成了一个面对对象的程序。下面我们就来看一下我们第一个认识的 BioPrel 的模块 Bio::SeqIO 。 2. 关于 Bio::SeqIO 的那些事儿 在介绍 Bio::SeqIO 之前,先来说一下为什么会产生 BioPerl 这个东西。在生物信息学起步之初 Prel 语言强悍的字符串处理能力以及执行效率,毫无疑问的被各位从计算机和数学行业转行过来的“生物学家”选为工具语言(在生物信息数据处理方面放眼望去毫无疑问是 Perl 语言的天下,近来对大规模数据的处理方面 R 语言亦有崛起之势)。但是,对于这海量的数据,同样丰富多彩的数据格式以及花样繁多的数据分析;每次处理数据都要重新自己编写正则表达式未免效率过于低下。于是,在 Perl 一次重大的更新之后(引入面对对象编程,后面都将使用 OOP 代替面对对象编程),几个不太勤快的学生物的程序员看到了通用编程的可能,于是就有了我们现在广泛应用的 BioPerl 。 那我们就来说说这个 Bio::SeqIO 以及它的姊妹模块 Bio::Seq 。我们为什么要使用 Bio::SeqIO 和 Bio::Seq 模块呢?其原因非常简单,就是因为这两个模块其实就是一个非常非常智能的文件句柄。 Bio::SeqIO 可以根据你的输入文件类型抽取出所需要的信息,而 Bio::Seq 则可以按照格式要求储存数据信息。就拿 GenBank 的 flat file 文件来讲,其中的 feature 等信息都是分门别类的进行储存。在这里说也不容易理解,下面我们直接上程序来说明。 3. Bio::SeqIO 支持的文件格式 Bio::SeqIO 几乎涵盖所有常见的生物学数据库的通用文档格式,并且可以很好的对格式进行转换,有如此方便的功能,全仰仗于 Perl 语言本身所具有的强悍的字符串处理能力。 下表所展示的就是截止于 1.6 版本 Bio::SeqIO 所支持的格式: Name Description File extension Module abi ABI tracefile ab Bio::SeqIO::abi ace Ace database ace Bio::SeqIO::ace agave AGAVE XML Bio::SeqIO::agave alf ALF tracefile alf Bio::SeqIO::alf asciitree write-only, to visualize features Bio::SeqIO::asciitree bsml BSML , using XML::DOM bsml Bio::SeqIO::bsml bsml_sax BSML , using XML::SAX Bio::SeqIO::bsml_sax chadoxml CHADO sequence format Bio::SeqIO::chadoxml chaos CHAOS sequence format Bio::SeqIO::chaos chaosxml Chaos XML Bio::SeqIO::chaosxml ctf CTF tracefile ctf Bio::SeqIO::ctf embl EMBL database ebl|emb|dat Bio::SeqIO::embl entrezgene Entrez Gene ASN1 Bio::SeqIO::entrezgene excel Excel Bio::SeqIO::excel exp Staden EXP format exp Bio::SeqIO::exp fasta FASTA fast|seq|fa|fsa|nt|aa Bio::SeqIO::fasta fastq quality score data in FASTA -like format fastq Bio::SeqIO::fastq flybase_chadoxml variant of Chado XML Bio::SeqIO::flybase_chadoxml game GAME XML Bio::SeqIO::game gcg GCG gcg Bio::SeqIO::gcg genbank GenBank gbank|genbank Bio::SeqIO::genbank interpro InterProScan XML Bio::SeqIO::interpro kegg KEGG Bio::SeqIO::kegg largefasta Large files, fasta format Bio::SeqIO::largefasta lasergene Lasergene format Bio::SeqIO::lasergene locuslink LocusLink LL_tmpl Bio::SeqIO::locuslink metafasta Bio::SeqIO::metafasta phd Phred phred Bio::SeqIO::phd pir PIR database pir Bio::SeqIO::pir pln PLN tracefile pln Bio::SeqIO::pln qual Phred Bio::SeqIO::qual raw plain text txt Bio::SeqIO::raw scf Standard Chromatogram Format scf Bio::SeqIO::scf seqxml SeqXML sequence format using XML::LibXML and XML::Writer xml Bio::SeqIO::seqxml strider DNA Strider format Bio::SeqIO::strider swiss SwissProt sp Bio::SeqIO::swiss tab tab-delimited Bio::SeqIO::tab table Table Bio::SeqIO::table tigr TIGR XML Bio::SeqIO::tigr tigrxml TIGR Coordset XML Bio::SeqIO::tigrxml tinyseq NCBI TinySeq XML Bio::SeqIO::tinyseq ztr ZTR tracefile ztr Bio::SeqIO::ztr 注意: bioperl-ext 以及 io_lib 库文件对于支持 scf, abi, alf, pln, exp, ctf, ztr 格式是不可或缺的。 下面我们就用例子来说话,来看一下 Bio::SeqIO 是如何将一个复杂的文件储存在对象( OOP 的概念)中方便处理的。 4. 方法大全 4.1. next_seq 首先来看代码如下所示: # print out accession numbers of all entries in a GenBank flat file. # first, bring in the SeqIO module use Bio :: SeqIO ; # Notice that you do not have to use any Bio:SeqI # objects, because SeqIO does this for you. In fact, it # even knows which SeqI object to use for the provided # format. # Bring in the file and format, or die with a nice # usage statement if one or both arguments are missing. my $usage = "getaccs.pl file format \n " ; my $file = shift or die $usage ; my $format = shift or die $usage ; # Now create a new SeqIO object to bring in the input # file. The new method takes arguments in the format # key = value, key = value. The basic keys that it # can accept values for are '-file' which expects some # information on how to access your data, and '-format' # which expects one of the Bioperl-format-labels mentioned # above. Although it is optional, it is good # programming practice to provide and in front of any # filenames provided in the -file parameter. This makes the # resulting filehandle created by SeqIO explicitly read () # or write(). It will definitely help others reading your # code understand the function of the SeqIO object. my $inseq = Bio :: SeqIO - new ( - file = "$file" , - format = $format , ) ; # Now that we have a seq stream, # we need to tell it to give us a $seq. # We do this using the 'next_seq' method of SeqIO. while ( my $seq = $inseq - next_seq ) { print $seq - accession_number , " \n " ; } 不知各位是否看出来以上代码的功能了吗?没错,其功能就是读取一个输入的一定格式文件的 Accession Number 。没有自己设计的正则表达式,不需要自行找出文件的规律,更不用每次都重新写一个处理文本的程序。需要做的就是关注你所需要的重点信息, SeqIO 模块的 next_seq 方法来搞定其他的东西。 至于程序中各变量的含义,待我细细分解,就是一些 OOP 的概念,多加揣摩就能看懂以后的关于 OOP 的程序啦。 首先来看 $inseq ,这个变量就可以理解为一个 object/instance , new 方法或函数建立的一个模块 SeqIO 的对象,模块中的方法都可以用于对这个对象进行处理。而 next_seq 就这之中的诸多方法之一。基本的语法结构就是“对象 – 方法( instance – method )”的形式。 next_seq 完成的动作就是取出文件中的一个 entry 的全部内容,然后根据需求找出你想要的数据就行了,比如 Accession Number 。 4.2. write_seq 看下面一个将一个格式的文件转为另外一个格式的程序: use Bio :: SeqIO ; # get command-line arguments, or die with a usage statement my $usage = "x2y.pl infile infileformat outfile outfileformat \n " ; my $infile = shift or die $usage ; my $infileformat = shift or die $usage ; my $outfile = shift or die $usage ; my $outfileformat = shift or die $usage ; # create one SeqIO object to read in,and another to write out my $seq_in = Bio :: SeqIO - new ( - file = "$infile" , - format = $infileformat , ) ; my $seq_out = Bio :: SeqIO - new ( - file = "$outfile" , - format = $outfileformat , ) ; # write each entry in the input file to the output file while ( my $inseq = $seq_in - next_seq ) { $seq_out - write_seq ( $inseq ) ; } 通过上一个例子,现在就可以知道了, write_seq 是对象 $seq_out 的一个方法,这个方法有一个变量,那就是 $inseq , $inseq 则是通过对象 $seq_in 的方法 next_seq 获得的。有点乱哈,不过仔细揣摩一下,对 OOP 加深一下认识。这里就不用自己设计需要输出什么了。因为,要输出的信息已经通过 next_seq 方法获得了。 In the end 至此 Bio::SeqIO 模块的两个主要方法已经介绍完了,其方法内各种参数的意义,请见本篇附表。下一弹, Bio::Seq 模块以及 translation 的应用,敬请期待!
个人分类: BioPerl|13356 次阅读|3 个评论
Perl代码实例之词频统计软件word_freq
热度 2 llt001 2012-4-26 13:55
今天在读《Shell 脚本学习指南》 时得到启发,很有兴趣写一个词频统计的软件。因此就花了几个小时用Perl语言写了一个100多行代码的软件。word_freq以自由软件 、开放源代码 的形式发布在此。文后附有源代码。 一、运行环境 1 perl 软件是由 Perl 写成,因此运行软件前,电脑上必须有 perl 解释器 , 可以在这里下载http://www.perl.org/get.html#win32 2 命令行 必须在命令行用户界面(Command User Interface) 下运行,因为软件是从标准输入(STDIN)读入文本流, 而将结果打印到标准输出(STDOUT), 可以很方便地做I/O重定向,以及组合管道。 二、输入输出 1 输入 输入为纯文本,未考虑支持中文。软件从标准输入读入数据,可以使用I/O重定向符号 ‘’ 或管道输入数据,也可以读取用户键入的内容。例如,cat file | word_freq, 或者 word_freq file,或者word_freq, 然后键入英文单词,Ctrl-D 结束。 2 输出 结果的输出如: Rank Word Freq. Sum 1 the 394 394 2 of 322 716 3 and 156 872 4 to 146 1018 5 in 123 1141 6 genome 98 1239 7 B 95 1334 8 a 84 1418 9 for 72 1490 10 were 69 1559 Total words in text: 7063 第一列为排序,第二列为单词,第三列为次数,第四列为累加,最后一行为总词数。 3 参数 -h 打印帮助页 -c 统计字符,而不是单词 -m NUM 打印单词出现次数不少于NUM的单词 -M NUM 打印单词出现次数不多于NUM的单词 -w NUM 打印单词长度不少于NUM的单词 -W NUM 打印单词长度不大于NUM的单词 -i 不区分大小写 以上参数可以组合使用 三、用途 1 文本分析 用于分析文章的词频。 2 辅助阅读英文论文 我使用了一篇英文论文做测试, 不区分大小写,统计获得1577个单词。看来只要掌握不超过2000个单词,就可以读懂一篇科学论文。 3计算DNA序列的GC含量。 参考资料: http://book.douban.com/subject/3519360/ http://www.gnu.org/gnu/the-gnu-project.html http://zh.wikipedia.org/wiki/Perl http://zh.wikipedia.org/wiki/命令行界面 源代码: #!/usr/bin/perl parse_commands(); if($help){help();} # # Parse input text # unless(@input_files){ while(STDIN){ if(\$character){@txt = $_ =~ /./g;} else{@txt = $_ =~ / +/g;} foreach(@txt){ if(\$ignore_case){\$_ = "\L$_\E";} \$word{$_}++; } $total += @txt; } }else{ foreach(@input_files){ open FILE,\$_ or die "Can't open file \$_: $!\n"; while(FILE){ if(\$character){@txt = \$_ =~ /./g;} else{@txt = \$_ =~ / +/g;} foreach(@txt){ if(\$ignore_case){\$_ = "\L$_\E";} \$word{$_}++; } $total += @txt; } close FILE; } } # # Print title # print "Rank\t"; if($character){ print "Char.\t"; }else{ print "Word\t"; } print "Freq.\t"; print "Sum\n"; # # Print frequency # foreach(sort{\$word{\$b} = \$word{$a}}(keys %word)){ if(\$min_freq \$word{\$_} $min_freq){next;} if(\$max_freq \$word{\$_} $max_freq){next;} if(\$min_length length(\$_) $min_length){next;} if(\$max_length length(\$_) $max_length){next;} $count++; \$sum += \$word{$_}; print "$count\t"; print "$_\t"; print "\$word{$_}\t"; print "$sum\n"; } print "Total ",(\$character?"characters":"words")," in text: $total\n"; # # Subroutines # sub parse_commands{ while(@ARGV){ $_ = shift @ARGV; if(-e \$_){push @input_files,$_;} elsif(\$_ eq '-h'){$help = 1;} elsif(\$_ eq '-c'){$character = 1;} elsif(\$_ eq '-m'){$min_freq = shift @ARGV;} elsif(\$_ eq '-M'){$max_freq = shift @ARGV;} elsif(\$_ eq '-w'){$min_length= shift @ARGV;} elsif(\$_ eq '-W'){$max_length = shift @ARGV;} elsif(\$_ eq '-i'){$ignore_case = 1;} else{ print STDERR "Unrecognized flag: $_\n"; print STDERR "$0 -h for help\n"; exit; } } } sub help{ system("clear"); print "WORD_FREQ(1) Word Frequency Analysis WORD_FREQ(1) NAME word_freq - word frequency analysis SYNOPSIS word_freq ... ... DESCRIPTION Count words of text from FILE(s), or standard input, and print the frequency of each word or character. OPTIONS -c Print frequency of characters -m NUM Print words with minimum frequency NUM -M NUM Print words with maximum freqeuncy NUM -w NUM Print words with minimum length NUM -W NUM Print words with maximum length NUM -i Ignore case -h Display this help and exit With no FILE, or when FILE is -, read standard input. AUTHOR Written by Leiting Li lileiting\@foxmail.com COPYRIGHT Copyright (c) 2012 Leiting Li. Licnese GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extend permitted by law. LEITING LI Febrary 2012 WORD_FREQ(1) "; exit; } (Leiting Li, Feb 26, 2012)
个人分类: Perl代码|8692 次阅读|3 个评论
Perl代码实例分析之从下载序列·一
热度 1 llt001 2012-4-26 13:25
从网 络 上下 载 DNA , mRNA 或 protein 序列,是分子生物学和生物信息学的基本功。最 简单 的下 载 序列的方式莫 过 于直接从 NCBI ( http://www.ncbi.nlm.nih.gov/ ) 检 索到序列,然后通 过 网 页 上的 Send to 选项下载之。本文的目的是通过对一例序列下载 Perl 语言代码来简要介绍 Perl及 BioPerl 的一些基础知识。 Perl 编程语言是生物信息学最流行的动态解释计算机语言 (Dynamic Interpreted Computer Languages) 。另外常用的动态解释语言有 Ruby 和 Python 。但是, Perl 相较于其它动态解释语言最大的优势在于拥有一个包含大量标准模块的仓库 (CPAN, http://www.cpan.org/) ,可供开发者使用。另外, Perl 语言本身的特点是,不同程度学习者都可以用来解决问题,比较适合研究生在生物信息学工作中通过写较少行数的 Perl 代码解决一些小问题。另外, Perl 语言也被称为编程语言中的“瑞士军刀”,功能强大。 这 里介 绍 的 Perl 代 码实 例使用了 Bio::Perl 模 块 来下 载 序列,并 将序列写入文件, Bioperl( http://search.cpan.org/~cjfields/BioPerl-1.6.901/Bio/Perl.pm , http://www.bioperl.org/wiki/Main_Page ) 是一个 专门为 生物信息学 应 用而开 发 的一个 Perl 模 块 套件。 写程序必 须 要考 虑 数据的 输 入和 输 出, 因为常用的生物信息学平台为GNU/ Linux 操作系统,命令行状态,所以,这里没有考虑 Windows 操作系统和图形用户界面 (GUI) 。这里使用三个参数跟在程序名后作为数据输入的方式 第一个参数是,来源数据库,支持的有 swiss, embl, genbank, genpept, refseq 。 第二个参数是,输出文件的格式,可以是 fasta 和 genbank 。 第三个参数是,序列编号文件,为一个编号一行的纯文本文件。 确定了以上三个参数后,还要进行环境的判断,假如参数没有三个怎么办呢?这里要说明 Perl 的一个默认数组 @ARGV ,用来保存程序的参数,因此,运行程序时,程序名 ( 默认变量 $0) 后的跟的第一个参数就是 $ARGV ,相应的第二个是 $ARGV ,第三个是 $ARGV 。 判断运行环境时首先定义了一个子过程,功能是打印使用方法( usage ,如果子程序定义在前, 符号可以省略),然后退出。接着进行了以下判断。 如果参数不是三个,调用 usage 子过程,退出程序。 如果第一个参数不是 swiss, embl, genbank, genpept, refseq 之一,调用 usage。 如果第二个参数不是 fasta, genbank 之一,调用 usage。 如果第三个参数指定文件打不开,调用 usage。 通过以上对参数的判断后,就可以按照预想的方式下载序列了。从参数中,程序了解到从哪个数据库下载哪些序列,保存为何种格式的文件。这样,程序就通过循环分别下载序列名称列表中的每一条序列,并写入到相应序列名称的文件中。 例子: echo NG_032174.1 JQ180353.1 |perl program_name genbank fasta - perl program_name genbank fasta List.txt 程序中涉及的关键内容 Bio::Perl @ARGV 子程序 STDERR get_sequence( ‘数据 库 ’ , ‘序列 编 号’ ) write_squence( “ 文件名”,“文件格式”,序列 对 象 ) 对 象 源代码: #!/usr/bin/env perl use Bio::Perl; sub usage{ print STDERR "Usage: $0 swiss|embl|genbank|genpept|refseq fasta|genbank List_of_Acc\n"; exit; } unless(@ARGV==3){usage;} \$db=$ARGV ; unless(\$db == 'swiss' || \$db == 'embl' || \$db == 'genbank' || \$db == 'genpept' || $db == 'refseq'){ print STDERR "Database name error: $db\n"; usage; } \$file_type=$ARGV ; unless(\$file_type == 'fasta' || $file_type == 'genbank'){ print STDERR "File type error: $file_type\n"; usage; } \$file=$ARGV ; unless(open FILE,$file){ print STDERR "Open file error: $file\n"; usage; } while(my $acc = FILE){ $acc =~ s/ //g; #去掉换行符号 print STDERR "Downloading $acc ... "; \$seq=get_sequence('genbank',"$acc"); if(write_sequence("./\$acc.\$ARGV ", "\$ARGV ",$seq)){ print STDERR "Writing to file \$acc.$ARGV "; } print STDERR "\n"; }
个人分类: Perl代码|7110 次阅读|1 个评论
根据基因长度及位点分布识别全基因组上组蛋白修饰模式(密码)代码
热度 2 linghu2049 2012-4-13 14:55
折腾了几周,基于perl编程,根据基因长度及其在染色体上的位置分布信息,在全基因组上我识别出了42641个组蛋白修饰模式组合(也就是某些人说的组蛋白密码),然后去除冗余,得到18506个不重复的组蛋白修饰模式。统计分析发现,其中大部分模式在全基因组上只出现了1次。出现次数大于等于4次的模式一共有927个。之前我在全基因组上用5000bp的半重叠窗去采集24条染色体上的组蛋白修饰模式,共得到854个模式。两者相比很多模式都比较接近。说明这些模式的确在染色体上发生了。下一步我想研究一下这些组蛋白修饰模式与DNA甲基化之间的关系。DNA甲基化以前没怎么接触过,希望好运~~,不说了,贴出批处理24条染色体,39种组蛋白修饰的perl代码。 #!/bin/perl use strict; my $file_name; my @doc_name=qw /chr1chr10chr11chr12chr13chr14chr15chr16chr17chr18chr19chr2chr20chr21chr22chr3chr4chr5chr6chr7chr8chr9chrMchrXchrY/; foreach $file_name (@doc_name) { my %Data; open(INFILE,"$file_name.txt"); while(INFILE) { chomp; if (/^\w+\t(\d+)\t(\w+)\t(\d+)\t(\d+)/) { my $gene = "$2-$1($3-$4)"; #Chromsome-geneID(Start-End) push @{$Data{$gene}},$3,$4; } } close(INFILE); open(DATA,"$file_name"); my @arr; while(DATA) { push @arr, ; } close DATA; my @histone=qw /CD4-H2BK120acCD4-H4K91acCD4-H2BK20acCD4-H3K4acCD4-H3K36acCD4-H2BK5acCD4-H3K27acCD4-H3K18acCD4-H3K9acCD4-H2BK12acH3K4me3H2AZCD4-H4K5acCD4-H4K8acH3K9me1H3K4me2H3K4me1H2BK5me1H4K20me1H3K79me3H3K79me2H3K79me1CD4-H4K12acCD4-H4K16acCD4-H2AK5acH4K20me3H4R3me2H3R2me2H3R2me1H3K27me1H3K36me3CD4-H3K23acCD4-H2AK9acCD4-H3K14acH3K27me3H3K36me1H3K27me2H3K9me3H3K9me2/; my %hash; my %index; my @temp; for (0..38) { $hash{$histone }=1; $index{$histone }=$_; $temp =0; } open(OUT,"out_$file_name"); foreach my $Locu (keys %Data) { my $spaceflag=0; #控制多余空行的输出 for(my $i=0;$i=$#arr;$i++){ if($arr - = $Data{$Locu}- $arr - =$Data{$Locu}- ){ #print OUT $Locu."\t"; #输出基因名及其位点信息 $temp - }]=$hash{$arr - }; #$index{$arr - }取值0~38;$hash{$arr - }取值39个修饰 $spaceflag=1; } } if($spaceflag==1){ print OUT $Locu."\t"; #统计重复时此行不要。 print OUT join("\t",@temp); print OUT "\n"; } for (0..38) { #每循环一次,变量@temp归零。 $temp =0; } } close OUT; }
个人分类: perl|6381 次阅读|2 个评论
perldoc真是一个好东西~
linghu2049 2012-4-6 11:00
想学习好perl的,perldoc是一个不错的地方~,看看人家解释split多么清楚。以前很多人推荐,还不是很信,去过几次都浮光掠影没发现精华,今天算是领教了。 split /PATTERN/,EXPR,LIMIT split /PATTERN/,EXPR split /PATTERN/ split Splits the string EXPR into a list of strings and returns that list. By default, empty leading fields are preserved, and empty trailing ones are deleted. (If all fields are empty, they are considered to be trailing.) In scalar context, returns the number of fields found. If EXPR is omitted, splits the $_ string. If PATTERN is also omitted, splits on whitespace (after skipping any leading whitespace). Anything matching PATTERN is taken to be a delimiter separating the fields. (Note that the delimiter may be longer than one character.) If LIMIT is specified and positive, it represents the maximum number of fields the EXPR will be split into, though the actual number of fields returned depends on the number of times PATTERN matches within EXPR. If LIMIT is unspecified or zero, trailing null fields are stripped (which potential users of pop would do well to remember). If LIMIT is negative, it is treated as if an arbitrarily large LIMIT had been specified. Note that splitting an EXPR that evaluates to the empty string always returns the empty list, regardless of the LIMIT specified. A pattern matching the empty string (not to be confused with an empty pattern // , which is just one member of the set of patterns matching the epmty string), splits EXPR into individual characters. For example: print join ( ':' , split ( / */ , 'hi there' ) ) , "\n" ; produces the output 'h:i:t:h:e:r:e'. As a special case for split , the empty pattern // specifically matches the empty string; this is not be confused with the normal use of an empty pattern to mean the last successful match. So to split a string into individual characters, the following: print join ( ':' , split ( // , 'hi there' ) ) , "\n" ; produces the output 'h:i: :t:h:e:r:e'. Empty leading fields are produced when there are positive-width matches at the beginning of the string; a zero-width match at the beginning of the string does not produce an empty field. For example: print join ( ':' , split ( /(?=\w)/ , 'hi there!' ) ) ; produces the output 'h:i :t:h:e:r:e!'. Empty trailing fields, on the other hand, are produced when there is a match at the end of the string (and when LIMIT is given and is not 0), regardless of the length of the match. For example: print join ( ':' , split ( // , 'hi there!' , -1 ) ) , "\n" ; print join ( ':' , split ( /\W/ , 'hi there!' , -1 ) ) , "\n" ; produce the output 'h:i: :t:h:e:r:e:!:' and 'hi:there:', respectively, both with an empty trailing field. The LIMIT parameter can be used to split a line partially ( $login , $passwd , $remainder ) = split ( /:/ , $_ , 3 ) ; When assigning to a list, if LIMIT is omitted, or zero, Perl supplies a LIMIT one larger than the number of variables in the list, to avoid unnecessary work. For the list above LIMIT would have been 4 by default. In time critical applications it behooves you not to split into more fields than you really need. If the PATTERN contains parentheses, additional list elements are created from each matching substring in the delimiter. split ( /( )/ , "1-10,20" , 3 ) ; produces the list value ( 1 , '-' , 10 , ',' , 20 ) If you had the entire header of a normal Unix email message in $header, you could split it up into fields and their values this way: $header =~ s/\n(?=\s)//g ; # fix continuation lines %hdrs = ( UNIX_FROM = split /^(\S*?):\s*/m , $header ) ; The pattern /PATTERN/ may be replaced with an expression to specify patterns that vary at runtime. (To do runtime compilation only once, use /$variable/o .) As a special case, specifying a PATTERN of space ( ' ' ) will split on white space just as split with no arguments does. Thus, split ( ' ' ) can be used to emulate awk 's default behavior, whereas split ( / / ) will give you as many initial null fields (empty string) as there are leading spaces. A split on /\s+/ is like a split ( ' ' ) except that any leading whitespace produces a null first field. A split with no arguments really does a split ( ' ' , $_ ) internally. A PATTERN of /^/ is treated as if it were /^/m , since it isn't much use otherwise. Example: open ( PASSWD , '/etc/passwd' ) ; while ( PASSWD ) { chomp ; ( $login , $passwd , $uid , $gid , $gcos , $home , $shell ) = split ( /:/ ) ; #... } As with regular pattern matching, any capturing parentheses that are not matched in a split() will be set to undef when returned: @fields = split /(A)|B/ , "1A2B3" ; # @fields is (1, 'A', 2, undef, 3)
个人分类: perl|5071 次阅读|0 个评论
[转载]Perl : How do I find the index of a specific array value?
zhangyuan1012 2012-3-21 02:51
Answer: how do i find the index of a specific array value? contributed by merlyn my @array = qw( your array here ); my $search_for = "here"; my( $index )= grep { $array eq $search_for } 0..$#array; Answer: how do i find the index of a specific array value? contributed by hdp For very large arrays where bailing out as soon as a match is found is a win: my @a = ( 1 .. 1_000_000 ); # some large array my $want = 5843; my $index = 0; ++$index until $a == $want or $index $#a; Answer: how do i find the index of a specific array value? contributed by I0 You could use an index hash: my @array = qw( your array here ); my $search = "array"; my %index; @index{@array} = (0..$#array); my $index = $index{$search}; print $index, "\n"; This is a win, for larger arrays, if you need to do multiple/many lookups while the array remains static. Answer: How do I find the index of a specific array value? contributed by snoopy I like List::MoreUtils : use List::MoreUtils; my @array = qw( Apples Oranges Brains Toes Kiwi); my $search = "Toes"; my $index = List::MoreUtils::first_index {$_ eq $search} @array; print "index of $search = $index\n"; Answer: How do I find the index of a specific array value? contributed by marcussen Using merlyn's example with regular expressions, so you don't need to know the exact value of the element you are matching; my @array = ( 'Name: Mr. Jones', 'Phone: 555-555', 'Email: jones@example.com' ); my ( $index )= grep { $array =~ /Phone/ } 0..$#array; Replace ( $index ) with an array to match multiple instances. Answer: how do i find the index of a specific array value? contributed by MeowChow You could use my aindex and raindex . Answer: How do I find the index of a specific array value? contributed by simul If the array is large and sorted, you might want search it more efficiently: my @array = qw( your large, sorted array here ); my $search = "thing"; my $index = bsearch(\@array, $search); sub bsearch { my ($array, $word) = @_; my $low = 0; my $high = @$array - 1; while ( $low = $high ) { my $try = int( ($low+$high) / 2 ); $low = $try+1, next if $array- lt $word; $high = $try-1, next if $array- gt $word; return $try; } return; } Answer: How do I find the index of a specific array value? contributed by myuserid7 You should usefirst()from List::Util . It is a core module, unlike List::MoreUtils and other modules mentioned above, so it is portable and can be used with no extra effort. use List::Util qw(first); my @array = qw( Apples Oranges Brains Toes Kiwi); my $search = "Toes"; my $index = first { $array eq $search } 0 .. $#array; print "index of $search = $index\n";
324 次阅读|0 个评论
[转载]perl学习资源电子书籍
lingyangxu 2012-3-11 10:39
首先,感谢整理书籍和转载的朋友! 这些书籍可以慢慢学习消化! Learning.Perl.4th.Edition.Jul.2005.chm Learning.Perl.5th.Edition.Jul.2008.pdf Programming_Perl_En_3rd_Edition.chm Programming_Perl_中文版_3rd_Edition.pdf Thinking.In.Perl.中文版.pdf Embedding.Perl.In.Html.With.Mason.chm Graphics.Programming.With.Perl.pdf Mastering.Algorithms.with.Perl.pdf Mastering.Perl.Jul.2007.pdf Network.Programming.With.Perl.chm Programming.the.Perl.DBI.pdf PerlLWP.chm PerlXML.chm Pleac.Perl.chm Practical.Mod_Perl.chm Higher.Order.Perl.pdf Wicked.Cool.Perl.Scripts.Useful.Perl.Scripts.That.Solve.Difficult.Problems.pdf Writing.Perl.Modules.For.CPAN.pdf CGI.Programming.with.Perl.chm Perl.Hacks.Tips.and.Tools.for.Programming.Debugging.and.Surviving.May.2.chm Perl.Testing.A.Developer's.Notebook.chm Web.Development.With.Apache.And.Perl.pdf Real.World.SQL.Server.Administration.with.Perl.chm Perl实例精解(第三版.影印版).pdf perl编程思想应用篇.pdf PerlCGI轻松进阶(PDG).rar Perl.On.MVS.pdf Perl.in.a.Nutshell.pdf Perl.Debugged.pdf Perl.Database.Programming.chm Perl.5.语言命令详解(影印版).pdf Packt.Publishing.Catalyst.Accelerating.Perl.Web.Application.Development.Nov.2007.pdf Learning.Perl.on.Win32.pdf Intermediate.Perl.Mar.2006.chm Impatient.Perl.pdf GENOMIC.PERL- From.Bioinformatics.Basics.to.Working.Code.pdf Extreme.Programming.in.Perl.pdf Effective.Perl.Programming- Writing.Better.Programs.with.Perl.chm DBI.中文版(影印版.字不是太清楚).pdf Bioinformatics.Biocomputing.and.Perl.pdf Beginning.Perl.Web.Development.From.Novice.To.Professional.pdf Advanced.Perl.Programming.2nd.Edition.chm Advanced.Perl.Programming.1st.Edition.pdf 来源:( http://blog.sina.com.cn/s/blog_494724250100d53u.html ) - Perl资料共享(下载)43本电子书_空想家de白日梦_新浪博客 另外7本在这里: http://blog.sina.com.cn/s/blog_494724250100ebkp.html 来源:( http://blog.sina.com.cn/s/blog_494724250100d53u.html ) - Perl资料共享(下载)43本电子书_空想家de白日梦_新浪博客
2877 次阅读|0 个评论
Perl 文件基本统计
lingyangxu 2012-2-24 22:34
use warnings; use strict; open FH,"test.txt"; open RESULT,"result.txt"; open LINE,"line.txt"; open LEN, "length.txt"; while (FH) { #chomp; print RESULT "line $. is $_"; print LINE "line $.\n"; my $leng=length$_; print LEN "The length of line $. is $leng \n"; } close FH; test.txt as follow 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3
2675 次阅读|0 个评论
[转载]Perl 函数控制数组和哈希
lingyangxu 2012-2-23 16:45
Perl 虽因其字符串处理能力而闻名,但是这并不意味着 Perl只能做字符串处理。这种语言还提供相当多的函数来处理和操纵其它的数据结构,其中包括很流行的数组和哈希。 我们这篇文章展示了一些属于这一类的非常有用的函数,并简要解释了每个函数的工作方式以及使用它们的时机。 函数 解释 示例 scalar(@arr) 这个函数将一个数组或哈希强迫解释成一个标量。当你需要得到一个数组或哈希的元素个数时,这一函数非常有用。 使用这个函数获取数组或哈希的大小,为循环以及处理数组或哈希内容做准备。 代码: #!/bin/perl # define array @data = ('apple', 'peach', 'banana'); # get size print "The array has " . scalar(@data) . " elements"; 输出: The array has 3 elements exists $hash{$key} 这个函数可以用来测试哈希中是否存在某个特定的键。 代码: #!/bin/perl # define hash %data = ('king' = 'queen', 'prince' = 'princess'); # check if key exists if (exists $data{'king'}) { print "Found!"; } 输出: Found! push(@arr, $val) 这个函数向数组的末尾添加一个新元素。 代码: #!/bin/perl # define array @data = ('a', 'b', 'c'); # add element push(@data, 'd'); 输出: a b c d pop(@arr) 这个函数从数组的末尾删除一个元素。 代码: #!/bin/perl # define array @data = ('a', 'b', 'c'); # add element pop(@data); print "@data "; 输出: a b unshift(@arr, $val) 这个函数向数组的开头添加一个新元素。 代码: #!/bin/perl # define array @data = ('a', 'b', 'c'); # add element unshift(@data, 'z'); print "@data "; 输出: z a b c shift(@arr) 这个函数从数组的开头删除一个元素。 代码: #!/bin/perl # define array @data = ('a', 'b', 'c'); # remove element shift(@data); print "@data "; 输出: b c splice(@arr, $offset, $length, @arr2) 这个函数删除数组中的某一个子集,被删除的子从$offset指定的位置开始,长度为$length个元素。如果可选参数@arr2出现,那么被提取的一段元素将会替换为数组@arr2。 使用这个函数可以提取数组的一个子集,也可以使用新值替换一个数组中的某些元素。 代码: #!/bin/perl # define array @data = ('king', 'queen', 'knight', 'bishop'); # remove middle elements splice(@data, 1, 2); print "@data "; 输出: king bishop delete $hash{$key} 这个函数从一个哈希中删除一个键,以及与这个键关联的值。 使用这个函数可以从哈希中删除元素。 代码: #!/bin/perl # define hash %data = ('king' = 'queen', 'prince' = 'princess'); # remove element with key 'king' delete $data{'king'}; split($delim, $str) 这个函数使用$delim将一个字符串分解,并返回一个以数字为索引的数组,返回数组的元素为原始字符串中由$delim分隔的各个部分。这些元素可以在一个循环中处理。 使用这个函数可以将逗号分隔的列表分割成独立的数组元素。 代码: #!/bin/perl # define string $str = "cat,hog,dog,log"; # split string on comma delimiter @words = split(",", $str); foreach $w (@words) { print "$w\n"; } 输出: cat hog dog log join($sep, @arr) 这个函数将一个数组的各个元素组合成一个单一的字符串,原来的各个元素使用$sep的值分隔。 使用这个函数可以将多个独立的数组元素组合成一个单一的字符串,而新组合成的字符串由空格、逗号或其它分隔符隔开。 代码: #!/bin/perl # define array @data = ("Harry", "Joan", "Tom"); # create string from arrayprint join(" and ", @data) . " are friends"; 输出: Harry and Joan and Tom are friends keys(%hash) 这个函数将哈希的键返回为一个以数字为索引的数组。这个函数与下面将要讨论的values()函数功能正好相对。 使用这个函数可以将一个哈希的键提取为一个独立的数据结构,用于以后的处理。 代码: #!/bin/perl # define hash %data = ('a' = 'apple', 'b' = 'bat', 'c' = 'cat'); # get and print hash keys @keys = keys(%data); 输出: c a b values(%hash) 这个函数将哈希的值返回为一个以数字为索引的数组。这个函数与前面讨论的keys()函数功能正好相对。 使用这个函数将一个哈希的值提取为一个独立的数据结构,用于以后的处理。 代码: #!/bin/perl # define hash %data = ('a' = 'apple', 'b' = 'bat', 'c' = 'cat'); # get and print hash keys @vals = values(%data); foreach $v (@vals) { print "$v "; } 输出: cat apple bat reverse(@arr) 这个函数将数组元素的次序翻转,将最后一个元素放在第一个,同样,将第一个元素放在最后。 使用这个函数可以将数组的元素的顺序调整为与当前顺序完全相反。 代码: #!/bin/perl # define array @data = ('apple', 'peach', 'banana'); # reverse array @rev = reverse(@data); print "@rev "; 输出: banana peach apple sort(@arr) 这个函数可以用来对数组或哈希进行排序。缺省情况下,这个函数使用标准的字符串对比规则进行排序;然而,你可以通过传入一个自定义排序子函数的名字来覆盖其缺省行为。 使用这个函数可以重置数组元素的内部顺序,或者以字母序、数字序或者自定义序来重新排列数组。 代码: #!/bin/perl # define hash @data = ('oranges', 'peaches', 'grapes', 'apples', 'lemons'); # sort alphabetically @sorted = sort(@data); print "@sorted "; 输出: apples grapes lemons oranges peaches
3240 次阅读|0 个评论
perl中用数组给数组赋值并访问
liujd 2012-1-7 10:33
1,数组地址给数组元素赋值\$a =\@b 可以把一个一维数组的地址赋值给另外一个一维数组的元素,这样就可以得到一个二维数组,但是访问的方式需要改变。 my (@a1,@a2); \$a1 =10;\$a1 =20;\$a1 =50;\$a1 =70; \$a2 =\@a1; \$a2 =\@a1; \$a2 =\@a1; \$a2 =\@a1; \$a2 =\ @a1; \${\$a2 } =77; print \${\$a2 } ; 这里输出的是77。\$a2 相当于数组名,访问里面元素当然要加\$和元素坐标 了。 获得第一维的上界:\$#a2 获得第二维的上界: \$#{\$a2 }; 2,数组直接给数组赋值 @a=@b 1)一维数组之间的赋值情况: 这里的复制是赋值的功能,@a是新构造的数组,里面的元素赋值于@b my (@a1,@a2); \$a1 =10;\$a1 =20;\$a1 =50;\$a1 =70; @a2=@a1; \$a2 =99; print \$a1 ; 这里输出的20,表示不是同一个数据空间 2)二维数组之间的赋值是引用复制 相当于把@b引用复制到@a中,这样他们共同指向一个列表 my (@a1,@a2); \$a1 =10;\$a1 =20;\$a1 =50;\$a1 =70; @a2=@a1; #\$a2 =99; print \$a1 ; 这里输出的是99 3,获得三维数组的编号 \$#row \$#{\$row } \$#{\$row }
个人分类: perl|5182 次阅读|0 个评论
perl的特殊变量
liujd 2012-1-6 19:20
1,$_变量 在读取文件时得到的行,以及数组遍列的元素值。
个人分类: perl|1072 次阅读|0 个评论
[转载]perl升级
liujd 2011-12-3 20:21
http://www.linux521.com/2009/system/200905/3095.html 下载地址: http://www.cpan.org/src/README.html 下载链接: http://www.cpan.org/src/perl-5.10.0.tar.gz 下载方式不用说了吧,各显神通,笔者习惯用wget. wget http://www.cpan.org/src/perl-5.10.0.tar.gz . 下载完以后解压安装 #tar zxvf perl-5.10.0.tar.gz #cd perl-5.10.0 # ./Configure -des -Dprefix=/usr/local/perl 参数-Dprefix指定安装目录为/usr/local/perl #make #make test #make install 如果这个过程没有错误的话,那么恭喜你安装完成了.是不是很简单? 接下来替换系统原有的perl,有最新的了咱就用嘛. #mv /usr/bin/perl /usr/bin/perl.bak #ln -s /usr/local/perl/bin/perl /usr/bin/perl #perl -v 恩,如果你那执行perl -v 和我的提示一样的话.就是安装成功了 然后就可以了用它来安装一些其它你需要的perl模块了 #perl -MCPAN -e shell 第一次执行的话,会提示安装cpan并要求连接网络下载最新的模块列表.然后就可以安装东西了 cpan install DBI
个人分类: perl|1037 次阅读|0 个评论
perl 散列
liujd 2011-12-3 19:07
perl 散列
个人分类: perl|804 次阅读|0 个评论
perl 输入和输出
liujd 2011-12-3 19:07
perl 输入和输出
个人分类: perl|859 次阅读|0 个评论
perl 控制结构和子程序
liujd 2011-12-3 19:06
perl 控制结构和子程序
个人分类: perl|1067 次阅读|0 个评论
[转载]perl正则表达式
liujd 2011-12-3 17:42
PERL里正则表达式的简介 一、简介 二、匹配操作符 三、模式中的特殊字符 1、字符+ 2、字符 3、字符 *和? 4、转义字符 5、匹配任意字母或数字 6、锚模式 7、模式中的变量替换 8、字符范围转义前缀 9、匹配任意字符 10、匹配指定数目的字符 11、指定选项 12、模式的部分重用 13、转义和特定字符的执行次序 14、指定模式定界符 15、模式次序变量 四、模式匹配选项 1、匹配所有可能的模式(g选项) 2、忽略大小写(i选项)例 3、将字符串看作多行(m选项) 4、只执行一次变量替换例 5、将字符串看作单行例 6、在模式中忽略空格 五、替换操作符 六、翻译操作符 七、扩展模式匹配 1、不存贮括号内的匹配内容 2、内嵌模式选项 3、肯定的和否定的预见匹配 4、模式注释 一、简介 模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即模式def。其用法如结合函数split将字符串用某模式分成多个单词:@array = split(/ /, $line); 二、匹配操作符 =~、!~ =~检验匹配是否成功:$result = $var =~ /abc/; 若在该字符串中找到了该模式,则返回非零值,即 true ,不匹配则返回0,即 false 。!~则相反。 这两个操作符适于条件控制中,如: if ($question =~ /please/) { print ("Thank you for being polite!\n"); } else { print ("That was not very polite!\n"); } 三、模式中的特殊字符 PERL在模式中支持一些特殊字符,可以起到一些特殊的作用。 1、字符 + +意味着一个或多个相同的字符,如:/de+f/指def、deef、deeeeef等。它尽量匹配尽可能多的相同字符,如/ab+/在字符串abbc中匹配的将是abb,而不是ab。 当一行中各单词间的空格多于一个时,可以如下分割: @array = split (/ +/, $line); 注:split函数每次遇到分割模式,总是开始一个新单词,因此若$line以空格打头,则@array的第一个元素即为空元素。但其可以区分是否真有单词,如若$line中只有空格,则@array则为空数组。且上例中TAB字符被当作一个单词。注意修正。 2、字符 c/将匹配a加数字加c的字符串。与+联合使用例:/d +f/匹配def、 dEf、deef、dEdf、dEEEeeeEef等。^表示除其之外的所有字符,如:/d f/匹配d加非e字符加f的字符串。 3、字符 * 和 ? 它们与+类似,区别在于*匹配0个、1个或多个相同字符,?匹配0个或1个该字符。如/de*f/匹配df、def、deeeef等;/de?f/匹配df或def。 4、转义字符 如果你想在模式中包含通常被看作特殊意义的字符,须在其前加斜线"\"。如:/\*+/中\*即表示字符*,而不是上面提到的一个或多个字符的含义。斜线的表示为/\\/。在PERL5中可用字符对\Q和\E来转义。 5、匹配任意字母或数字 上面提到模式/a c/匹配字母a加任意数字加c的字符串,另一种表示方法为:/a c/,类似的, 表示任意小写字母, 表示任意大写字母。任意大小写字母、数字的表示方法为:/ /。 6、锚模式 锚 描述 ^ 或 \A 仅匹配串首 $ 或 \Z 仅匹配串尾 \b 匹配单词边界 \B 单词内部匹配 例1:/^def/只匹配以def打头的字符串,/$def/只匹配以def结尾的字符串,结合起来的/^def$/只匹配字符串def(?)。\A和\Z在多行匹配时与^和$不同。 例2:检验变量名的类型: if ($varname =~ /^\$ *$/) { print ("$varname is a legal scalar variable\n"); } elsif ($varname =~ /^@ *$/) { print ("$varname is a legal array variable\n"); } elsif ($varname =~ /^ *$/) { print ("$varname is a legal file variable\n"); } else { print ("I dont understand what $varname is.\n"); } 例3:\b在单词边界匹配:/\bdef/匹配def和defghi等以def打头的单词,但不匹配abcdef。/def\b/匹配def和 abcdef等以def结尾的单词,但不匹配defghi,/\bdef\b/只匹配字符串def。注意:/\bdef/可匹配$defghi,因为$并 不被看作是单词的部分。 例4:\B在单词内部匹配:/\Bdef/匹配abcdef等,但不匹配def;/def\B/匹配defghi等;/\Bdef\B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。 7、模式中的变量替换 将句子分成单词: $pattern = " +"; @words = split(/$pattern/, $line); 8、字符范围转义 E 转义字符 描述 范围 \d 任意数字 \D 除数字外的任意字符 \w 任意单词字符 \W 任意非单词字符 \s 空白 \S 非空白 例:/ /匹配任意数字或小写字母。 9、匹配任意字符 字符 "." 匹配除换行外的所有字符,通常与*合用。 10、匹配指定数目的字符 字符对{}指定所匹配字符的出现次数。如:/de{1,3}f/匹配def,deef和deeef;/de{3}f/匹配deeef;/de{3,}f/匹配不少于3个e在d和f之间;/de {0,3} f/匹配不多于3个e在d和f之间。 11、指定选项 字符"|"指定两个或多个选择来匹配模式。如:/def|ghi/匹配def或ghi。 例:检验数字表示合法性 if ($number =~ /^-?\d+$|^-?0 +$/) { print ("$number is a legal integer.\n"); } else { print ("$number is not a legal integer.\n"); } 其中 ^-?\d+$ 匹配十进制数字,^-?0 +$ 匹配十六进制数字。 12、模式的部分重用 当模式中匹配相同的部分出现多次时,可用括号括起来,用\n来多次引用,以简化表达式: /\d{2}( )\d{2}\1\d{2}/ 匹配: 12-05-92 26.11.87 07 04 92等 注意:/\d{2}( )\d{2}\1\d{2}/ 不同于/(\d{2})( )\1\2\1/ ,后者只匹配形如17-17-17的字符串,而不匹配17-05-91等。 13、转义和特定字符的执行次序 象操作符一样,转义和特定字符也有执行次序: 特殊字符 描述 () 模式内存 + * ? {} 出现次数 ^ $ \b \B 锚 | 选项 14、指定模式定界符 缺省的,模式定界符为反斜线/,但其可用字母 m 自行指定,如: m!/u/jqpublic/perl/prog1! 等价于/\/u\/jqpublic\/perl\/prog1/ 注:当用字母作为定界符时,不做变量替换;当用特殊字符作为定界符时,其转义功能或特殊功能即不能使用。 15、模式次序变量 在模式匹配后调用重用部分的结果可用变量$n,全部的结果用变量$。 $string = "This string contains the number 25.11."; $string =~ /-?(\d+)\.?(\d+)/; # 匹配结果为25.11 $integerpart = $1; # now $integerpart = 25 $decimalpart = $2; # now $decimalpart = 11 $totalpart = $; # now totalpart = 25.11 四、模式匹配选项 选项 描述 g 匹配所有可能的模式 i 忽略大小写 m 将串视为多行 o 只赋值一次 s 将串视为单行 x 忽略模式中的空白 1、匹配所有可能的模式(g选项) @matches = "balata" =~ /.a/g; # now @matches = ("ba", "la", "ta") 匹配的循环: while ("balata" =~ /.a/g) { $match = $; print ("$match\n"); } 结果为: ba la ta 当使用了选项g时,可用函数pos来控制下次匹配的偏移: $offset = pos($string); pos($string) = $newoffset; 2、忽略大小写(i选项)例 /de/i 匹配de,dE,De和DE。 3、将字符串看作多行(m选项) 在此情况下,^符号匹配字符串的起始或新的一行的起始;$符号匹配任意行的末尾。 4、只执行一次变量替换例 $var = 1; $line = ; while ($var 10) { $result = $line =~ /$var/o; $line = ; $var++; } 每次均匹配/1/。 5、将字符串看作单行例 /a.*bc/s匹配字符串axxxxx \nxxxxbc,但/a.*bc/则不匹配该字符串。 6、在模式中忽略空格 /\d{2} ( ) \d{2} \1 \d{2}/x等价于/\d{2}( )\d{2}\1\d{2}/。 五、替换操作符 语法为s/pattern/replacement/,其效果为将字符串中与pattern匹配的部分换成replacement。如: $string = "abc123def"; $string =~ s/123/456/; # now $string = "abc456def"; 在替换部分可使用模式次序变量$n,如s/(\d+)/ /,但在替换部分不支持模式的特殊字符,如{},*,+等,如s/abc/ /将把abc替换为 。 替换操作符的选项如下表: 选项 描述 g 改变模式中的所有匹配 i 忽略模式中的大小写 e 替换字符串作为表达式 m 将待匹配串视为多行 o 仅赋值一次 s 将待匹配串视为单行 x 忽略模式中的空白 注:e选项把替换部分的字符串看作表达式,在替换之前先计算其值,如: $string = "0abc1"; $string =~ s/ +/$ x 2/e; # now $string = "0abcabc1" 六、翻译操作符 这是另一种替换方式,语法如: tr/ string1/string2/。同样,string2为替换部分,但其效果是把string1中的第一个字符替换 为string2中的第一个字符,把string1中的第二个字符替换为string2中的第二个字符,依此类推。如: $string = "abcdefghicba"; $string =~ tr/abc/def/; # now string = "defdefghifed" 当string1比string2长时,其多余字符替换为string2的最后一个字符;当string1中同一个字符出现多次时,将使用第一个替换字符。 翻译操作符的选项如下: 选项 描述 c 翻译所有未指定字符 d 删除所有指定字符 s 把多个相同的输出字符缩成一个 如$string =~ tr/\d/ /c;把所有非数字字符替换为空格。$string =~ tr/\t //d;删除tab和空格; $string =~ tr/0-9/ /cs;把数字间的其它字符替换为一个空格。 七、扩展模式匹配 PERL支持PERL4和标准UNIX模式匹配操作所没有的一些模式匹配能力。其语法为:(?pattern),其中c是一个字符,pattern是起作用的模式或子模式。 1、不存贮括号内的匹配内容 在PERL的模式中,括号内的子模式将存贮在内存中,此功能即取消存贮该括号内的匹配内容,如/(?:a|b|c)(d|e)f\1/中的\1表示已匹配的d或e,而不是a或b或c。 2、内嵌模式选项 通常模式选项置于其后,有四个选项:i、m、s、x可以内嵌使用,语法为:/(?option)pattern/,等价于/pattern/option。 3、肯定的和否定的预见匹配 肯定的预见匹配语法为/pattern(?=string)/,其意义为匹配后面为string的模式,相反的,(?!string)意义为匹配后面非string的模式,如: $string = "25abc8"; $string =~ /abc(?= )/; $matched = $; # $为已匹配的模式,此处为abc,而不是abc8 4、模式注释 PERL5中可以在模式中用?#来加注释,如: if ($string =~ /(?i) {2,3}(?# match two or three alphabetic characters)/ { ... }
个人分类: perl|860 次阅读|0 个评论
perl基础:perl中@_,$_和$1,$2,...及其类似变量的含义
linghu2049 2011-10-17 22:10
Perl's a great language for special variables - variables that are set up without the programmer having to intervene and providing information ranging from the number of lines read from the current input file ($.) through the current process ID ($$) and the operating system ($^O). Other special variables effect how certain operations are performed ($| controlling output buffering / flushing, for example), or are fundamental in the operation of certain facilities - no more so than $_ and @_. ------------------------------------------- 1.@_含义 1)是perl中默认的数组变量 比如说你想移除数组中的一个元素赋值给一个变$value 方法1:你可以定义某个数组如@abcd my $value=shift @abcd; 方法2:你没有定义任何数组 my $value=shift @_; 和上例等效 这里perl会隐式的选择@_ 2)是sub子函数中的默认参数列表. 例如: sub funct($$) { ($param1, $param2) = @_; #Statement } 再例如,有下面一段代码: my $max_number = max(1,2); print "1 and 2 ,the max number is $max_number\n"; sub max{ my ($num1,$num2) = @_ ; ## 取出参数列表中的元素。 ........此处省略求max运算 } 在子函数中直接shift; 就可以从@_的前端弹出一个元素. shift; 等于 shift @_; ------------------------- @_ is the list of incoming parameters to a sub. So if you write a sub, you refer to the first parameter in it as $_ , the second parameter as $_ and so on. And you can refer to $#_ as the index number of the last parameter: sub demo { print "Called with ",$#_+1," params\n"; print "First param was $_ \n"; Note that the English module adds in the ability to refer to the special variables by other longer, but easier to remember, names such as @ARG for @_ and $PID for $$. But use English; can have a detrimental performance effect if you're matching regular expressions against long incoming strings 2.$_含义 1)$_为默认列表变量。在一个命令没有任何参数的时候,表示它从默认变量里读取。 例如: print; 等于 print $_; 2)默认模式匹配空间( pattern matching space ) s/.../.../; 等于 $_ =~ s/.../.../; --------------------------- Then any regular expression matches, chop s (and lc s and many more) without a parameter, and even print s assume you want to work on $_. Thus: while ($line = FH) { if ($line =~ /Perl/) { print FHO $line; } print uc $line; } Shortens to: while (FH) { /Perl/ and print FHO ; print uc; } 3.$1,$2,...等含义 以数字为名的变量保存的是上一次匹配操作(/pattern/)中,第n个小括号中的原符号所匹配内容。 $1就是第一对小括号中的原符号所对应的匹配内容。 $2就是第二对小括号中的原符号所对应的匹配内容。 内插功能: $str = "aaa4zzz7bbb"; $str =~ /(\d)z{3}(\d)/; print "$1\t$2\n"; 输出结果是:4 7
个人分类: perl|27271 次阅读|0 个评论
[转载]Perl基础:运算符
linghu2049 2011-10-12 10:41
from: http://bdxnote.blog.163.com/blog/static/8444235200822710950442/ 1、数字运算符 :+(加) 、-(减)、 *(乘) 、/(除)、**(乘方/乘幂)、%(取余); 这些运算符混合了整数、浮点数和实数运算,运算的结果都寸入了正确的数字上下文中; 复合赋值运算符: +=、-=、*=、/=、**=、%=、.=、=、|=、^=、=、=、=、||=; 自增/自减运算符: ++/-- ++运算符除了可用于数字运算之外,还可以用于字符串运算,而--运算符则只能用于数字运算中; 如: $str = "abc"; $str++; 此时$str = "abd"; 2、条件运算符: Perl中的条件运算符有两类: 数字比较运算符和字符串比较运算符;它们的返回值是布尔值。布尔值只有真或假两种;Perl中使用数字1表示真,使用数字0表示假; A、数字比较运算符: 、=、、=、==、!=、=; 其中 = 的返回值有三个: -1:左边小于右边 1:左边大于右边 0:左边等于右边 B、字符串比较运算符: (1)、字符串联接运算符:. (2)、字符串重复运算符:x (3)、字符串连接赋值运算符:.= 主要有几种:lt(小于)、gt(大于)、eq(等于)、le(小于等于)、ge(大于等于)、ne(不等于)、cmp(比较); 字符串比较运算符与数字比较运算符的对比: 字符串比较 数字比较 描述 lt 运算符左边的表达式小于运算符右边的表达式 gt 运算符左边的表达式大于运算符右边的表达式 eq == 运算将左边的表达式等于运算符右边的表达式 le = 运算符左边的表达式小于等于运算符仓边的表达式 ge = 运算符左边的表达式大于等于运算将右边的表达式 ne != 运算符左边的表达式不等于运算符右边的表达式 cmp = 运算符左边的表达式与运算符右边的表达式比较, 小于返回-1,大于返回1.等于返回0。 在进行字符串比较的时候,Perl解释器会把两个字符串中的每一个字符都转换成对应的ASCII值,然后再把两个字符串中对应的字符进行比较,直到比较完为止; 3、逻辑运算符: 逻辑与: 或 and 逻辑或:| | 或 or 逻辑非:! 或 not 逻辑异或:xor Perl中的逻辑运算符也遵循C/C++中的“短路”逻辑求值原则; 4、位运算符: 按位与 | 按位或 ~ 按位非 ^ 按位异或 左移位 右移位 5、区块运算符: 它是Perl特有的运算符,用“..”表示;如: @digits = (1 .. 9); #将生成一个从1到9的列表; @Chars=('a' .. 'z');#将生成一个从字母'a'到字母'z'的一个顺序列表; 该运算符也称为列表范围运算符; 6、三元条件运算符: 与C/C++一样,Perl也有一个三元条件运算符: 逻辑表达式 ? 表达式1 :表达式2; 7、逗号运算符: 逗号运算符前面的表达式先进行运算,按照从左到右的顺序依次进行求值,整个表达式返回逗号运算符中的最后一个表达式的
个人分类: perl|3613 次阅读|0 个评论
学习笔记:几个有用的perl的模块
chenhao392 2011-8-6 09:04
索引 1.Parallel::ForkManager perl的一个简便的多线程叉口,用在for/while等循环体中。 2.Bio::DB::Fasta 读取各类格式的序列的模块。 3.Bio::SearchIO 读取各类blast结果的模块。 4.Bio::Search::Tiling::MapTiling 重叠blast结果中,同一个subject 序列的多个HSP的模块。 实例 1.Parallel::ForkManager my $pm = new Parallel::ForkManager(4); #建立object,选择需要的thread 数量,此处为4个 ... while(FILE){ $pm-start and next; #在循环中开始产生threads .... $pm-finish; #threads结束 } $pm-wait_all_children; #循环所有threads结束后开始后续步骤 Tips: 1. Thread数量为0时为调试模式,相当于没有此模块,便于调试程序。 2. 因为多线程返回结果不同时,循环内部如果有类似打印信息的命令,其打印顺序会混乱. 2.Bio::DB::Fasta #建立一个序列的database,再把序列提到一个hash里 my $db= Bio::DB::Fasta-new($seq_file)-get_PrimarySeq_stream; my %seq; while( my $seq = $db-next_seq ) { my $data=$seq-seq($seq); $data =~ s/\n//g; my $id=$seq-id; $seq{$id}=$data; } 3.Bio::SearchIO my $blio = Bio::SearchIO-new( -format = 'blast', -file = $file _path); #有多种格式可以选择,blast 通吃m0, m8等格式 while(my $result = $blio-next_result){ my $query_name=$result-query_name; #query 序列id my @hits=$result-hits; #所有hit,per subject gene ... } 4.Bio::Search::Tiling::MapTiling # $result为例子3中的Bio::SearchIO的object foreach my $hit ($result-hits){ my $tiling = Bio::Search::Tiling::MapTiling-new($hit); #为每一个hit建立object my $ident = $tiling-identities('query','exact'); #用exact方法计算per gene的identity,共有est, exact..等等3个方法 ... } Tips: 1. exact方法最耗时,同时是最精确的. est次之,那个fast的方法,结果相差甚远. 2. exact和est方法需要 “比对图例” ,m0格式。而默认blastall会给出最多500个 “tab分隔结果” ,250个比对图例,需要调整-b和-v两个参数使二者一致。 tab分隔结果: Score E Sequences producing significant alignments: (bits) Value Thhalv10000734m|PACid:20179467 2474 0.0 Thhalv10000744m|PACid:20202590 1316 0.0 比对图例: Thhalv10000734m|PACid:20179467 Length = 1358 Score = 2474 bits (6411), Expect = 0.0, Method: Compositional matrix adjust. Identities = 1210/1342 (90%), Positives = 1210/1342 (90%) Query: 1 MASTPQFLLDDQTDEDFFDKLVDDXXXXXXXXXXXXXKELKFDDGSDSDDAKAFANXXXX 60 MASTPQFLLDDQTDEDFFDKLVDD KELKFDDGSDSDDAKAFAN Sbjct: 1 MASTPQFLLDDQTDEDFFDKLVDDSFSPSEAHASSSAKELKFDDGSDSDDAKAFANLSLV 60 ...
8569 次阅读|0 个评论
如果编程语言是一条船
热度 1 longxie1983 2011-6-16 16:30
如果编程语言是一条船
刚刚在google reader上看到的,太给力了。 Turing:小巧,适合初学者,就像 kayak(皮划艇) Java:本身很庞大,能容纳很多东西,就像 货轮 Perl:有四两拨千斤之巧,就像 拖船 Ruby:时尚,性感,总之很潮,就像 摩托艇 PHP:很简陋,有些东拼西凑,就像 木筏 C:指令像外语,但是性能最出色,就像 核潜艇 HTML:根本不是编程语言..... ===================================================================== FORTRAN:专为数字而生的,就像 护卫舰 R, MATLAB, SAS:擅长科学发现,但是需要更大的载体来移动,就像 深海探测器 注:图片来自网络,版权归原作者所有。 原文:http://mendel.soup.io/post/138357929/If-a-programming-language-was-a-boat
个人分类: 杂文|5745 次阅读|2 个评论
Cairo 中的文字渲染模型
lry198010 2010-7-23 23:13
图示,Cairo中的文字的图形模型在 http://cairographics.org/tutorial/ 有比较详细的说明,最近因为需要,根据这个说明做了更详细的图示说明。 在select_font_face(font_family,slant,weight)中可用的一般有字体有:serif, sans-serif, cursive, fantasy, monospace等标准CSS2的一般性字体;可用的slant是:normal,italic和oblique;可用的weight是:normal和bold。 对于含有fgjpqyQ的字符窜来说,其高度和宽度分别为width 和abs(y_bearing)+descent,对于不含有这些字符的字符串来说,其宽度和高度分别为width和abs(y_bearing)
个人分类: R|5276 次阅读|0 个评论
怎样才能避免不谨慎和想当然
热度 1 chenhao392 2010-5-5 00:05
我在一个很小的问题上摔倒了两次. 几个月以前,我写过一个perl的小程序,目的是给一些蛋白质按照某分类方式进行分类,去掉一些冗余的蛋白。 这个只有一百行的小程序却出了问题,因为我想当然的用了sort函数直接给一个二维数组排序,当时有结果,程序没有报错,程序就写下去了。 直到今天我才偶然发现分类有问题,我在程序里面查了一会,才发现根本就没有排序正确。傻了眼的我上网去查,才发现sort给二维数组排序,排的是他们的引用,而不是数据本身。 看了看那个论坛的讨论,我照别人的方案做了,貌似成功了,兴冲冲的就对不同的数据都跑了这个程序....然后才发现只是大部分分类正确,还是错的。。 这回我才老老实实的尝试不同代码,打印排序结果,直到程序可以适应 所有数据。 这回真的是欲速则不达了,还好最后检查出了问题,要是这个大问题没发现,对后期的工作影响很大,想想真觉得后怕. 分析原因至少有三: 1。我的编程基本功不扎实。 2。在遇到以前编程没有遇到的情况时,没有动脑子,只是等着程序报错,这个习惯很不好。 3。不仔细检查输出的结果是否真的正确。 有这种粗枝大叶的毛病,怎么能做好科研呢... 唉,真伤脑筋. 怎样才能避免不谨慎和想当然的作事情呢?
个人分类: 生活点滴|4875 次阅读|2 个评论
Perl1.1 缩写
anny424 2009-9-1 09:36
虽然已经能够用Perl编程解决问题,可是别人编的程序大多数都看不懂,究其原因,就是他们的语句太简炼了,基本都是缩写。 例子:我就是从这个程序认识到这个问题的 #去除序列注释行中第一个|后面的注释 #by Ge Ying open(IN_FILE, $ARGV ); open(OUT_FILE, $ARGV ); while (defined($in_line = IN_FILE)) { if ($in_line =~ /^/) { chomp($in_line); @identity_tokens = split /\|/,$in_line; $gi_num = $identity_tokens ; print OUT_FILE gi$gi_num\n; } elsif ($in_line !~ /^/) { chomp($in_line); print OUT_FILE $in_line\n; } } close(IN_FILE); close(OUT_FILE); #dxy_LaughCry 提供 use strict; my $file = WRONG; while(){ if( /^gi\|.*?\|.*?\|(.*)\|/ ){ # if( /^gi\|\d+\|\w+\|(\S+)\|/ ){ #二选一 $file = $1; $file =~ s/\.\d+//; $file .= '.seq'; open(OUT,$file); } print OUT $_; } # dxy_latex提供 while(){ if(/^/){ @head=split(/\|/,$_); @oname=split(/\./,$head ); $name=$oname ; $file=$name..seq; open(OUT,$file); } print OUT $_; } 今天解决一下这个问题,整理出缩写及对应的完整语句。 1. 读入输入文件 #特殊的文件句柄 diamond read operator () which automatically opens up each file on the command line. while () # open(IN_FILE, $ARGV ); while (defined($in_line = IN_FILE)) 2. 模式匹配 if(/^/) # if ($in_line =~ /^/) 3.变量名 $_ #默认数据变量: @head=split(/\|/,$_); #@head = split /\|/,$in_line; 另附: Perl语言编程特殊技巧 继续整理中
个人分类: 编程学习笔记|2026 次阅读|0 个评论
R1.4 merge替代Perl的提取程序
anny424 2009-8-29 22:48
今天本来打算查R的循环语句,无意间碰到了一个函数,合并两个 数据框,能够替代perl里面的一段程序,用于按照ID列表提取数据。 x-data.frame(a=c(a,b,c,c)) x a 1 a 2 b 3 c 4 c y-data.frame(a=c(a,b,c), b=c(10,20,30)) y a b 1 a 10 2 b 20 3 c 30 merge(x,y) a b 1 a 10 2 b 20 3 c 30 4 c 30 ?merge Merge two data frames by common columns or row names, or do other versions of database join operations. 相应的perl程序: open(DATABASE,$ARGV ); open(PICK,$ARGV ); open(PICKDATA,$ARGV ); while (defined($in_line = DATABASE)) { chomp $in_line; @tokens = split /\t/,$in_line; $tokens_ID = $tokens ; $hash{$tokens_ID}=$in_line; } while (defined($in_line = PICK)) { chomp $in_line; @Seq_tokens = split /\t/,$in_line; $Seq_tokens_ID = $Seq_tokens ; print PICKDATA $hash{$Seq_tokens_ID}\n; } close DATABASE; close PICK; close PICKDATA;
个人分类: 统计学习笔记|2427 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-21 05:28

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部