科学网

 找回密码
  注册

tag 标签: Perl

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

[转载]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
2659 次阅读|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|27251 次阅读|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 ...
8551 次阅读|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
个人分类: 杂文|5734 次阅读|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|5255 次阅读|0 个评论
怎样才能避免不谨慎和想当然
热度 1 chenhao392 2010-5-5 00:05
我在一个很小的问题上摔倒了两次. 几个月以前,我写过一个perl的小程序,目的是给一些蛋白质按照某分类方式进行分类,去掉一些冗余的蛋白。 这个只有一百行的小程序却出了问题,因为我想当然的用了sort函数直接给一个二维数组排序,当时有结果,程序没有报错,程序就写下去了。 直到今天我才偶然发现分类有问题,我在程序里面查了一会,才发现根本就没有排序正确。傻了眼的我上网去查,才发现sort给二维数组排序,排的是他们的引用,而不是数据本身。 看了看那个论坛的讨论,我照别人的方案做了,貌似成功了,兴冲冲的就对不同的数据都跑了这个程序....然后才发现只是大部分分类正确,还是错的。。 这回我才老老实实的尝试不同代码,打印排序结果,直到程序可以适应 所有数据。 这回真的是欲速则不达了,还好最后检查出了问题,要是这个大问题没发现,对后期的工作影响很大,想想真觉得后怕. 分析原因至少有三: 1。我的编程基本功不扎实。 2。在遇到以前编程没有遇到的情况时,没有动脑子,只是等着程序报错,这个习惯很不好。 3。不仔细检查输出的结果是否真的正确。 有这种粗枝大叶的毛病,怎么能做好科研呢... 唉,真伤脑筋. 怎样才能避免不谨慎和想当然的作事情呢?
个人分类: 生活点滴|4860 次阅读|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-10 16:10

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部