perl编程
㈠ 谁知道perl编程里的s/^\s+//; 这个语句是什么意思
正则里,
^
匹配行首(字符串开始位置)
\s
匹配任意的空白符,包括空格,制表符(Tab)等
+
表示重复前一个字符至少1次(1次或多次)
s/A/B/
结构将正则A匹配到的内容替换为B。
所以,这里的意思大致就是:去除行首的所有空白符。
㈡ perl 编程问题
我用的方法比较土, 你试试看吧。期待后面更精彩的
#!/usr/bin/perl
use warnings;
open (INPUTF, $ARGV[0]) or die "can not open $ARGV[0] file";
open (OUTPUTF, ">$ARGV[1]") or die "can not open $ARGV[1] file";
$i=0;
while ( <INPUTF> ) {
last if ( $ARGV[2] == $i );
$i++;
}
if ( $ARGV[2] == $i ) {
@cons=split(/(?=[\w\W])/);
if ( @cons > $ARGV[3] ) {
printf(OUTPUTF "%s", $cons[$ARGV[3]-1]);
} else {
print "the $ARGV[2] lines do NOT have $ARGV[3] characters!\n"
}
} else {
print "$ARGV[0] do NOT have $ARGV[2] lines\n";
}
close INPUTF;
close OUTPUTF;
㈢ 编程初学者适不适合学perl
语言都是相通的,任何语言学会一门在学另外一门就简单多了,所以初学者以什么语言开始都没有问题,因为对你来说任何一门语言都是新的,区别就是学习时间长短的问题,有基础就学的快一些
㈣ 哪位发明了Perl编程语言
Larry Wall
Larry Wall是一名程序员,语言学家,作者,出生于1949年3月10日,出生地:加拿大卑斯省的邓肯市,众所周知的是它在1987年发明了Perl计算机语言。Larry Wall是Perl的创造者,也是其他一些流行的Unix自由软件的作者,包括rn新闻阅读器和无处不在的patch程序。从学历来看,Larry实际上是一位语言学家,是加州大学伯克利分校和洛杉矶分校的毕业生。在这些年中,他在Unisys、JPL、NetLabs和Seagate工作过,做的事情从离散事件模拟器到网络管理系统,偶尔还搞过宇宙飞船。正是在Unisys工作的期间,在他试图把一个跨东西海岸的配置管理系统用一个1200波特的加密链路、和一个经过修改的Netnews粘合起来时,Perl诞生了。Larry目前为O'Reilly公司工作。
㈤ perl语言高手请进 求个简单编程
#!/usr/bin/perl -w
use strict;
my @lines;
while (<STDIN>) {
chomp;
last if /^(?:quit|exit)$/i;
push @lines, $_;
}
print "Name\t", "Total\n";
for (@lines) {
next unless /\d/;
my @temp = split /\s+/;
print $temp[0], "\t", $temp[1]+$temp[2], "\n";
}
㈥ Perl入门教程
2楼真是的,人家还没入门,你直接整个文件操作干嘛?
什么是Perl?
Perl 是一种最初开发用于文本操作的编程语言。现在它能应用于广泛的任务,包括系统管理、 web 开发、 网络编程、 GUI 开发和更多的普通用途。
这个语言以实用性为目标(易用、高效、完整)宁愿失去美丽(小巧、优雅、迷你)。它使用方便,且支持面向过程和面向对象编程,内置强大的文本处理支持,并有世界上最令人印象深刻的第三方模块的集中营。
运行Perl程序
在Unix命令行运行Perl程序:
perl progname.pl
另一种方法是,把这个放到你的脚本第一行:
#!/usr/bin/env perl
然后用/path/to/script.pl运行。当然,首先得让它能执行,你得chmod 755 script.pl(Unix下)。
(这里的第一行假设你有env程序。你也可以直接把你的perl解释器的路径直接放到第一行,比如#!/usr/bin/perl)
安全保障
默认情况下,Perl非常随意。为了使它更强健建议每个程序由下列行开始:
1. #!/usr/bin/perl
2. use strict;
3. use warnings;
附加的两行从perl中捕获您的代码中的各种常见的问题。它们检查不同的事情,所以你需要两个都加上。一个潜在的问题通过use strict;捕获,一旦它捕获到问题,会马上让你的程序停止运行。当然使用use warnings;时,仅仅出现警告(就好像命令行的-w选项)并不会停止程序。
基本语法概述
一个Perl脚本或程序包含一条或多条语句。这些语句只需直接写在脚本中,而不需要像main()这样的东西作为程序入口。
Perl语句以分别结束:
print "Hello, world";
以星号(#)开始的语句是注释:
# This is a comment(这是一条注释)
空白字符会被Perl忽略:
1. print
2. "Hello, world"
3. ;
……引号里的字符串除外:
1. # this would print with a linebreak in the middle
2. print "Hello
3. world";
字符串使用双引号或单引号:
1. print "Hello, world";
2. print 'Hello, world';
然而,只有双引号会“插入”变量值和像换行符(\n)这样的特殊字符(转义字符):
1. print "Hello, $name\n"; # works fine
2. print 'Hello, $name\n'; # prints $name\n literally
数字不需要引号:
print 42;
你可以使用或省略括号来传递函数的参数。它们只是在偶尔要改变或明确优先级的时候必须使用。
1. print("Hello, world\n");
2. print "Hello, world\n";
Perl变量类型
Perl有3种主要的变量类型:标量(scalars)、数组(arrays)和哈希(hashes)。
* 标量(Scalars)
一个标量表示只有一个值:
1. my $animal = "camel";
2. my $answer = 42;
标量的值可以是字符串、整数或浮点数,并且Perl会在需要的时候自动转换。你不需要预先声明你的变量类型,但是你需要在第一次使用它们的时候,使用my来声明它们。(这是use strict;所要求的)
标量可以用不用的方式使用:
1. print $animal;
2. print "The animal is $animal\n";
3. print "The square of $answer is ", $answer * $answer, "\n";
有大量的“魔法”标量的名称看上去像标点或线路噪音。这些特殊的变量用于各种目的。现在你只要知道其中一个,这就是“默认变量”$_。它被许多Perl的函数用作默认的参数,并且它被隐式设置到某些循环结构中。
print; # prints contents of $_ by default(默认打印$_的内容)
* 数组(Arrays)
数组用于表示一些值的列表:
1. my @animals = ("camel", "llama", "owl");
2. my @numbers = (23, 42, 69);
3. my @mixed = ("camel", 42, 1.23);
特殊变量$#array将返回数组最后一个元素的索引:
print $mixed[$#mixed]; # last element, prints 1.23
你可能想使用$#array + 1来得到这个数组的元素个数。别急,这很容易。在Perl预想找到一个标量值的时候(“在标量上下文”),使用@array会得到数组的元素个数:(译注:“上下文”是Perl很重要的特性之一,请查阅相关文档或在无忧Perl搜索相关内容)
if (@animals < 5) { ... } #译注:当@animals数组的元素个数少于5个的时候
当我们从数组获得元素值的时候,需要使用$,因为我们只要获取数组里的一个值;你请求一个标量,然后会获得一个标量。
从数组里获取多个值:
(译注:获取多个值,使用@,因为我们要获取数组里的几个值(列表)。)
1. @animals[0,1]; # gives ("camel", "llama");
2. @animals[0..2]; # gives ("camel", "llama", "owl");
3. @animals[1..$#animals]; # gives all except the first element
这叫“数组切片”。
你可以在列表里干些有意义的事情:
1. my @sorted = sort @animals;
2. my @backwards = reverse @numbers;
有两个特殊的数组,一个是命令行传到你脚本的参数@ARGV;另一个是传递给子程序的参数@_。
* 哈希
哈希用来表示键/值对:
1. my %fruit_color = ("apple", "red", "banana", "yellow");
你可以使用空白字符和=>操作符来美化上面的代码:
1. my %fruit_color = (
2. apple => "red",
3. banana => "yellow",
4. );
获取哈希元素:
1. $fruit_color{"apple"}; # gives "red"
你可以通过keys()和values()来获取键列表和值列表。
1. my @fruits = keys %fruit_colors;
2. my @colors = values %fruit_colors;
哈希没有特定的内部排序,然而你可以对键进行排序来遍历它。
和特殊的标量、数组一样,哈希也有特殊的。我们现在只要知道哈希%ENV包括所有环境变量
。
更复杂的数据类型可以使用引用来构造,允许你把列表和哈希放到另一个列表和哈希中。
引用是一个标量值,它可以引用任何其它的Perl数据类型。通过把引用存储为数组或哈希的元素值,你可以轻松创建列表/哈希中的列表/哈希。
以下示例演示了使用匿名哈希引用实现的两级哈希结构
1. my $variables = {
2. scalar => {
3. description => "single item",
4. sigil => '$',
5. },
6. array => {
7. description => "ordered list of items",
8. sigil => '@',
9. },
10. hash => {
11. description => "key/value pairs",
12. sigil => '%',
13. },
14. };
15.
16. print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n";
变量作用域
上面所有的例子都使用这种语法:
1. my $var = "value";
实际上,my不是必须的。你可以省略:(译注:前提是,你没有使用“use strict;”语句)
1. $var = "value";
但是,上面的用法将创建一个全局变量,这是一个很差的编程实践。my创建一个词法作用域变量,这个变量只在定义它们的语句块中可见(比如一段包在大括号里的语句)。
1. my $x = "foo";
2. my $some_condition = 1;
3. if ($some_condition) {
4. my $y = "bar";
5. print $x; # prints "foo"
6. print $y; # prints "bar"
7. }
8. print $x; # prints "foo"
9. print $y; # prints nothing; $y has fallen out of scope
结合使用my和在Perl脚本开头使用use strict,解释器将捕获常见的编程错误。比如,在上面的例子中,最后的print $y将引发一个编译时错误并阻止程序运行。强烈建议使用use strict语句!
条件和循环语句
Perl有许多常用的条件和循环语句。Perl 5.10甚至提供了分支语句(拼作given/when)。
条件可以是任何Perl表达式。比较和布尔条件语句中常用的逻辑运算符,请参阅有关信息的下一节中的运算符的列表。
* if
1. if ( condition ) {
2. ...
3. } elsif ( other condition ) {
4. ...
5. } else {
6. ...
7. }
还有否定版本的:
1. unless ( condition ) {
2. ...
3. }
这个否定版比if (!condition)更易读。
注意,大括号是必须的,即使代码块中只有一行。不过,这里有一个方法可以让你通过类似英语的语法来实现单行条件语句:
1. # the traditional way
2. if ($zippy) {
3. print "Yow!";
4. }
5.
6. # the Perlish post-condition way
7. print "Yow!" if $zippy;
8. print "We have no bananas" unless $bananas;
* while
1. while ( condition ) {
2. ...
3. }
为了和unless同样的理由,也有一个否定版本:
1. until ( condition ) {
2. ...
3. }
你也可以在后置条件里使用while:
print "LA LA LA\n" while 1; # loops forever
* for
跟C语言一样:
1. for ($i = 0; $i <= $max; $i++) {
2. ...
3. }
自然Perl提供了更友好的列表遍历循环foreach以后,C语言风格的for循环在Perl几乎不需要了。
* foreach
1. foreach (@array) {
2. print "This element is $_\n";
3. }
4.
5. print $list[$_] foreach 0 .. $max;
6.
7. # you don't have to use the default $_ either...
8. foreach my $key (keys %hash) {
9. print "The value of $key is $hash{$key}\n";
10. }
内置操作符和函数
Perl 附带了各种各样的内置函数。我们已经看到的几个,包括print,sort和reverse。
Perl常见操作符(运算符)
* 算术
1. + 加法
2. - 减法
3. * 乘法
4. / 除法
* 数字比较
1. == 等于
2. != 不等于
3. < 小于
4. > 大于
5. <= 小于等于
6. >= 大于等于
* 字符串比较
1. eq 等于
2. ne 不等于
3. lt 小于
4. gt 大于
5. le 小于等于
6. ge 大于等于
(为什么数字和字符串的比较运算符不同?因为我们没有不同的变量类型,并且Perl需要知道是以数字进行排序(99小于100)还是以字母进行排序(100在99前面))
* 逻辑
1. && and 和
2. || or 或
3. ! not 否
* 混合
1. = 赋值
2. . 字符串连接
3. x 字符串乘法
4. .. 范围 (建立一个列表)
一些操作符可以和=结合,像这样:
1. $a += 1; # same as $a = $a + 1
2. $a -= 1; # same as $a = $a - 1
3. $a .= "\n"; # same as $a = $a . "\n";
文件和I/O
你可以使用open()函数来打开一个文件,用于输入或输出:
1. open(my $in, "<", "input.txt") or die "Can't open input.txt: $!";
2. open(my $out, ">", "output.txt") or die "Can't open output.txt: $!";
3. open(my $log, ">>", "my.log") or die "Can't open my.log: $!";
你可以使用<>操作符从打开的文件句柄中读数据。在标量上下文中,它从文件句柄中读取一行;在列表上下文中,它读取整个文件,并将每一行作为列表的元素。
1. my $line = <$in>;
2. my @lines = <$in>;
一次性把整个文件读完,叫做“啜食(slurping)”。它能让人满意,但它可能是内存吞噬者。大多数文本文件处理可以通过Perl的循环结构,一行一行地完成。
<>操作符经常出现在while循环里:
1. while (<$in>) { # assigns each line in turn to $_
2. print "Just read in this line: $_";
3. }
我们已经看到了如何使用print()在标准输出里打印。但是,print()还能通过第一个可选参数指定一个文件句柄来打印(译注:将内容输出到指定的文件句柄中,即写入到文件句柄相关联的文件中)
1. print STDERR "This is your final warning.\n";
2. print $out $record;
3. print $log $logmessage;
当你完成了对文件句柄的操作之后,你应该使用close()来关闭文件句柄。(老实说,如果你忘记关闭了,Perl会帮你处理。)
close $in or die "$in: $!";
正则表达式
Perl对正则表达式的支持宽广而深入:
* 简单匹配
1. if (/foo/) { ... } # true if $_ contains "foo"
2. if ($a =~ /foo/) { ... } # true if $a contains "foo"
//匹配操作符(译注,完整的应该是:m//)默认操作$_,或者使用=~来绑定其它变量进行操作。
* 简单置换
1. s/foo/bar/; # replaces foo with bar in $_
2. $a =~ s/foo/bar/; # replaces foo with bar in $a
3. $a =~ s/foo/bar/g; # replaces ALL INSTANCES of foo with bar in $a
* 更复杂的正则表达式
你不仅能匹配固定的字符串。其实,你可以匹配任何你能想到的复杂正则表达式。
1. . 单个任意字符(默认不包含\n)
2. \s 一个空白字符 (空格, tab, 换行, ...)
3. \S 一个非空白字符
4. \d 一个数字 (0-9)
5. \D 一个非数字
6. \w 一个能组成单词的字符 (a-z, A-Z, 0-9, _)
7. \W 一个不能组成单词的字符
8. [aeiou] 匹配中括号内的任意一个字符
9. [^aeiou] 匹配除了中括号内列出的字符之外的任意一个字符
10. (foo|bar|baz) 匹配foo或bar或baz
11.
12. ^ 匹配开头
13. $ 匹配结尾
量词可用来指定数量:
1. * 零个或任意多个
2. + 至少一个
3. ? 零个或一个
4. {3} 3个
5. {3,6} 3到6个
6. {3,} 至少3个
一些简单的例子:
1. /^\d+/ 以一个或多个数字开头
2. /^$/ 空的,没有任何东西
3. /(\d\s){3}/ 3个带空白字符的数字
4. (比如 "3 4 5 ")
5. /(a.)+/ 匹配最少一次,含有a和任意字符
6. (比如 "abacadaf")
7.
8. # 从STDIN循环读入,并打印出非空白行:
9. while (<>) {
10. next if /^$/;
11. print;
12. }
* 圆括号捕捉
括号的另一个用法是分组。它可以用来捕捉最后使用的正则表达式匹配的结果。这些结果用$1、$2……表示。
1. # a cheap and nasty way to break an email address up into parts
2.
3. if ($email =~ /([^@]+)@(.+)/) {
4. print "Username is $1\n";
5. print "Hostname is $2\n";
6. }
子程序
写一个子程序是很容易的:
1. sub logger {
2. my $logmessage = shift;
3. open my $logfile, ">>", "my.log" or die "Could not open my.log: $!";
4. print $logfile $logmessage;
5. }
现在我们可以像使用其它内置函数一样,使用该子程序了:
1. logger("We have a logger subroutine!");
什么是shift?传递给子程序的参数保存在@_数组中。shift函数的默认参数是@_。所以my $logmessage = shift;去掉第一个参数,并将其赋值给$logmessage。
可以通过别的方法操作@_:
1. my ($logmessage, $priority) = @_; # common(通用)
2. my $logmessage = $_[0]; # uncommon, and ugly(不通过,并且很丑陋)
子程序可以返回值:
# sub square {
# my $num = shift;
# my $result = $num * $num;
# return $result;
# }
然后像这样使用它:
1. $sq = square(8);
Perl面向对象
Perl面向对象相对比较简单,这是实现使用引用什么样的对象知道自己是在Perl的概念为基础的封装。
刚开始进行Perl编程,你最常使用的Perl面向对象将是使用第三方模块,参见下文。
使用Perl模块
Perl 模块提供了一系列的功能,可帮助您避免重复劳动,它们可以通过CPAN(www.cpan.org)下载。许多流行的模块都已经包含在了Perl发行包中。
本文由无忧Perl(www.51perl.com)翻译,转载请注明本文链接:www.51perl.com/perl-brief-introction/
水平有限,错误难免,欢迎指正,并以原文为准。原文地址:http://perldoc.perl.org/perlintro.html
希望对你有用
㈦ perl 编程中 my $obj = ... 和 my ($obj) = ... 有什么区别
这个问题,其实是有区别的,但实际使用时,可能没有区别。为什么这么说呢?
my $obj 这样使用,是要返回一个scalar变量。my ($obj)这样呢,是要返回一个 array。
我们都知道,perl里的变量类型转换很方便,方便到你都感觉不到。
为了便于理解,写一个例子:
usestrict;
my$a=getdata();
print"$a ";
my($b)=getdata();
print"$b ";
subgetdata
{
return123;
}
这个程序,a和b的输出结果都是123。其中a是要一个变量,返回值刚好是一个变量,没有类型转换,就是123。b是要一个数组,返回值是一个变量,就会进行类型转换,转成了(123)这样只有一个元素的数组,再赋值给($b)数组,$b得到该数组中的第一个值,所以还是123。
再举一个例子:
usestrict;
my$a=getdata();
print"$a ";
my($b)=getdata();
print"$b ";
subgetdata
{
return(123,456);
}
这样会输出什么呢?a是要一个变量,返回的是一个数组,所以它接收到最后一个数据,也就是$a=456。b是要一个数组,返回的是一个数组,所以直接得到了该数组,然后$b得到了该数组的第一个元素,也就是123。
好多模块要编写时,就考虑到了这种情况,在它们的模块里,有判断需要什么返回的语句:wantarray。
wantarray
gforalistvalue..(voidcontext).
举个例子:
my$a=getdata();
print"$a ";
my($b)=getdata();
print"$b ";
subgetdata
{
returnwantarray?(123):456;
}
这个函数的返回值就好理解了。函数问你想要什么样的值,如果想要array就给你返回(123)这个数组,否则就返回456这个值。所以这段代码的输入分别是456和123。
㈧ 哪位发明了Perl编程语言
Perl的作者是Larry Wall , 曾经贡献过好几个很有用的
程式给大家(public domain)使用,包括patch和rn。他设计perl时的哲学是以
实用为第一优先,(所谓的实用就是语言容易使用, 有效率, 而且完整),而不是设
计一个看起来很漂亮的语言。(漂亮就是程式非常的小,语法幽雅,而且只由
最少的语法基本元素构成)。Perl包含了C, sed, awk,和sh这几个工具最好(作
者(Larry) 说的) 的特色,而且主要的语法很接近C 语言, 对原本熟悉C 语言
的人来说非常容易上手。
㈨ perl语言编程怎么回事
Perl,其他的您别想,她就是一门语言。然后呢,因为很爽,所以现在主流的Linux平台都提供Perl,有一些开源程序(包括我知道有一个WOW插件)是Perl写的,有一些包是用Perl去build的。可以不严格地说,Perl是Linux事实上的系统语言之一。纯种的UNIX我不熟,不清楚情况。
Perl曾经是CGI事实上的指定语言,但因为Perl的缺点——对于写CGI来说过于强大,杀鸡用牛刀——所以现在用Perl写CGI的不多了,php、JSP比较多,要用CGI的话直接考虑C/C++的也不少。
Perl还有一个重要用途,就是在生物信息学上。她有一个开源模块叫BioPerl,这个倒是可以做个类比:BioPerl在生物信息学的地位就像MatLab在数学中的地位一样。
Perl的模块非常神奇,经过长年发展,已经号称“几乎可以完成任何你想得到的功能”。你想做什么的话,直接上CPAN搜模块就行了,这也是她能迅速成为一个实用工具的原因。
我很喜欢Perl,因为这个语言很自由。用C写程序我会觉得我在工作,但用Perl写程序我会觉得我在和电脑说话,这种感觉很舒服。但是,您不要迷信Perl,因为纯Perl效率绝对不高;你可以喜欢她,但她不是神,就这么个概念。也有很多人也鄙视Perl,觉得这是个怪胎、邪教;但我就要说,我鄙视正统,我喜欢歪门邪道。
另外,关于Perl的名字,不要理会什么实用抽取与报告。这就是LW为了凑pearl(珍珠)这个词深造的……
㈩ Perl是什么
发明perl的larry wall就说过:“perl可能不好看或者不好闻,但是它能完成任务”。 perl是文本处理语言,它最初就是为了这个目的设计的。 perl是网络编程语言,它内置了socket/client-server协议。 perl是系统管理语言,全球网络很多服务器上就运行着它的脚本。很多时候是单行的脚本。 perl是web脚本编写语言。至今它仍然是最流行的几种web脚本编写语言之一。 perl还可以: 用perl生成代码 用perl(调用tk)编写gui程序。 在c/c++中进行perl编程,在perl中进行c/c++编程 用perl过滤邮件 用perl数据仓库编程 在web上进行搜索 有人说perl无所不能。 ----------------------------------------------------------------------------------------------------- 我个人觉得perl的文本处理能力是无以替代的。它的正则表达式功能之强大是其他编程语言无法达到的。 即使微软的jscript/vbscript在正则表达式这项功能努力仿照和追赶perl,但仍然有很大的差距。 perl里面的哈希结构也是一个十分有趣的东西,vbscript里面对应的是dictionary,但是dictionary有欠直观。 如果你对照一下perl和php,会发现两者程序之间有很多类似的地方,php在产生的时候受到了perl很多的影响, 说php来源于perl也不为过。 perl甚至和vbscript/jscript一样可以编写asp程序。但同时,perl又不仅仅只有web脚本的功能。。。。但我 们很多web程序员用asp/php/jsp在编写基于web的聊天室,用隐藏桢刷新聊天内容的老土办法的时候,实际perl 写的基于socket的chat server程序早就存在了。你甚至不需要用c/c++来做这些复杂的事情,一个perl一百行 代码就可以做到了。 perl一直以来是一个免费的语言。你不用任何费用就可以获得perl世界里面的代码包括perl本身。perl不是由 某个公司大力推广而得到发展的,正如java那样。perl用它自身的力量来发展自己。当我们发现perl的开发调 试工具就可以用perl来写作,就不能不为它的神奇而感动。perl的世界是一个真正的自由的世界。 更多的时候,我觉得看一下perl,也是有很多地方值得借鉴的。有一些编程的方法就可以学过来,然后放到你所