Perl
Posted 牛学汇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl相关的知识,希望对你有一定的参考价值。
Perl语言介绍与实战
☑超灵活
☑可扩展
☑应用广
Perl简介
Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机平台上,适用广泛,从大型机到便携设备,从快速原型创建到大规模可扩展开发。
Perl 语言的应用范围很广,除CGI以外,Perl被用于图形编程、系统管理、网络编程、金融、生物以及其他领域。由于其灵活性,Perl被称为脚本语言中的瑞士军刀。
什么是Perl
Perl是由Larry Wall设计的,并由他不断更新和维护的编程语言。
Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。
Perl与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味着Perl对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的。
Perl提供脚本语言(如sed和awk)的所有功能,还具有它们所不具备的很多功能。Perl还支持sed到Perl及awk到Perl的翻译器。
简而言之,Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
Perl 优点
相比C、Pascal这样的"高级"语言而言,Perl语言直接提供泛型变量、动态数组、Hash表等更加便捷的编程元素。
Perl具有动态语言的强大灵活的特性,并且还从C/C++、Basic、Pascal等语言中分别借鉴了语法规则,从而提供了许多冗余语法。
在统一变量类型和掩盖运算细节方面,Perl做得比其他高级语言(如:Python)更为出色。
由于从其他语言大量借鉴了语法,使得从其他编程语言转到Perl语言的程序员可以迅速上手写程序并完成任务,这使得Perl语言是一门容易用的语言。
Perl 是可扩展的,我们可以通过CPAN("the Comprehensive Perl Archive Network"全面的 Perl 存档网络)中心仓库找到很多我们需要的模块。
Perl 的 mod_perl 的模块允许 Apache web 服务器使用 Perl 解释器。
Perl 缺点
也正是因为Perl的灵活性和"过度"的冗余语法,也因此获得了仅写(write-only)的"美誉",因为Perl程序可以写得很随意(例如,变量不经声明就可以直接使用),但是可能少写一些字母就会得到意想不到的结果(而不报错),许多Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍,这就令程序的维护者(甚至是编写者)难以维护。
同样的,因为Perl这样随意的特点,可能会导致一些Perl程序员遗忘语法,以至于不得不经常查看Perl手册。
建议的解决方法是在程序里使用use strict;以及use warnings;,并统一代码风格,使用库,而不是自己使用"硬编码"。Perl同样可以将代码书写得像Python或Ruby等语言一样优雅。
很多时候,perl.exe进程会占用很多的内存空间,虽然只是一时,但是感觉不好。
实战演练
今天见到一个表达式 ————
$line =~ m/^@([^ ]+)$/xmso; 一直没搞懂是什么意思,经过查阅资料才明白。这里跟大家分享,我们知道perl可以自定义文件中行的分割符,虽然默认的是‘ ’,但是也可以一次将文件中的所有‘行’读入在一个字符串变量中。然后在对这个字符串变量进行模式匹配的分析。假设有文件内容如下:
%ATCGBIONEW
888888866666666
%ITISVERYGOOD
666666688888888
如果一次读入在一个变量中,就是:
%ATCGBIONEW 888888866666666 %ITISVERYGOOD 666666688888888
先说锚定符,如果在单行模式 /s 下使用^或$来表示匹配开始或末尾的话,那么^、$将匹配的是字符串的开头和末尾,而并不是以‘ ’为概念的行的开头和末尾,如果想匹配‘ ’为概念的行的开头和末尾,则要与多行模式混合 /m 使用,即 m/你的模式/sm,但是这还取决于另一个元字符——'.'。
再说下元字符'.',我们知道‘.’在模式匹配中表示任意字符。那么在混合模式下,如果你用m/^(.+)$/ms。你猜猜你得到的是什么,实际上是从字符串的开头到末尾的字符,而不是每行的内容,以上面的内容为例:
my $line =
"%ATCGBIONEW
888888866666666
\%ITISVERYGOOD
666666688888888";
$line =~ m/^%(.+)$/ms;
print $1;
此时的输出为:
ATCGBIONEW
888888866666666
%ITISVERYGOOD
666666688888888
实际是从字符串第一个%开始直到字符串末尾。可是如果想匹配的是‘ ’分割的行内的任意字符怎么办呢?实际上就如最前面的例子一样,用[^ ]来代替这个‘.’。
修改下前面的例子:
my $line =
"\%ATCGBIONEW
888888866666666
\%ITISVERYGOOD
666666688888888";
$line =~ m/^%([^ ]+)$/ms;
print $1;
现在输出的结果为:
ATCGBIONEW
如果将所有匹配的内容返回给数组的话:
my $line =
"\%ATCGBIONEW
888888866666666
\%ITISVERYGOOD
666666688888888";
my @match = $line =~ m/^%([^ ]+)$/msg;
print join ‘,’, @match;
结果如下:
ATCGBIONEW, ITISVERYGOOD
结束,谢谢大家!
牛学汇
以上是关于Perl的主要内容,如果未能解决你的问题,请参考以下文章