rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » Perl

Perl语言入门

CPAN 是全面Perl 归档网络(Comprehensive PerlArchive Network)的缩写,可以上这个网站:
http://kobesearch.cpan.org #! /usr/bin/perl
$ chmod a+x my_program
$ ./my_program
#! /usr/bin/perl
@lines= `perldoc –u –f atan2`;
foreach(@lines){
s/\w<([^>]+)/\U$1/g;
print;
} if($name gt ‘fred’){
print “‘$name’comes after ‘fred’in sorted order.\n”;
}else{
print “‘$name’does not come after ‘fred’.\n”;
print “Maybe it’s the same string, in fact.\n”; 在if 控制结构的条件判断部分可以使用任意的标量值。这在某些时候将很方便,如:
$is_bigger = $name gt‘fred’;
if($is_bigger){… } 使用行输入操作符(line-input operator),<STDIN>
是行输入运算符对文件句柄STDIN 的操作
$line = <STDIN>;
if($line eq “\n”){
print “That was just a blank line!\n”;
}else{
print “That line of input was: $line”;
} $text = “a line of text\n”; #也可以由<STDIN>输入
chomp($text); #去掉换行符(\n)。 $count = 0;
while ($count < 10) {
$count + = 2;
print “count is now $count\n”; #打印出2 4 6 8 10
} 由于undef 在需要数字的地方可以自动转化为0,因此可以如下的写代码: #n = 1;
while($n < 10){
$sum += $n;
$n +=2;#下一个奇数 print “The total was $sum.\n” 能返回undef 的操作之一是行输入操作,<STDIN>。
◆事实上,从键盘输入,不会有“end-of-file”,但其可重定向到文件中再输入。或者用户可能输入某些键,而系统将其作为end-of-file 看待。
$madonna = <STDIN>;
If ($defined ($madonna)){
print “The input was $madonna”;
}else{
print “No input available!\n”;
} @rocks = qw{ flintstone slate rubble };
print “quartz @rocks limestone\n”; #输出为5 种rocks 由空格分开
@fred = qw(eating rocks is wrong);
$fred = “right”; #我们将打印“this is right[3]”
print “this is $fred[3]\n”; #打印出“wrong”使用$fred[3]
print “this is ${fred}[3]\n”; #打印出“right”(由花括号分开)
print “this is $fred”. “[3]\n”; #正确(两个字符串,右. 分开)
print “this is $fred\[3]\n”; #正确(利用反斜线转义) 如果能处理整个数组或列表,那将是非常方便的,因此Perl 提供了这种方法。foreach 从列表的第一个元素一直循环执行到 foreach $rock (qw/ bedrock slate lava /){
print “One rock is $rock.\n”; #打印出3 种rocks @rocks = qw/ bedrock slate lava /;
foreach $rocks(@rocks){
$rock = “\t$rock”; #@rocks 的每一个元素前加入一个tab
$rock . = “\n”; #每一个元素后加一个换行符 print “The rocks are:\n”,@rocks; #每一个元素都被缩进了,并且一个元素占一行 如果在foreach 循环中省略了控制变量,那Perl 会使用其默认的变量:$_。除了其不寻常的名字外,这和普通变量类似,如 foreach(1..10){ #使用默认的变量$_
print “I can count to $_!\n”; 虽然它不是Perl 中唯一的默认变量,但无疑是使用的最普遍的。你将在许多例子中看到Perl 在没有要求它使用某个变量或
值时,会自动使用变量$_,这将节约程序员大量的时间来思考使用哪一个变量
$_ =“Yabba dabba doo\n”;
print; #打印出默认变量$_。 @fred = 6 ..10;
@barney = reverse (@fred); #得到10,9,8,7,6
@wilma = reverse 6 ..10; #同上,没有使用额外的数组
@fred = reverse @fred; #将逆转过的字符串存回去
reverse @fred; #错误,没有改变@fred 的值
@fred = reverse @fred; #改变了@fred 的值 @rocks = qw/ bedrock slate rubble granite /;
@sorted = sort(@rocks); #得到bedrock, granite, rubble, slate
@back = reverse sort @rocks; #为slate 到bedrock
@rocks = sort @rocks; #将排序的值写回@rocks
@numbers = sort 97 ..102; #得到100,101,102,97,98,99
sort @rocks; #错误,不会修改@rocks
@rocks = sort @rocks; #现在@rocks 值是经过排序的 42 + something #something 必须是标量
sort something #something 必须是列表
数组@people 的真实名字是people。@只是一个限定词(qualifier)。
@people = qw( fred barney betty );
@sorted = sort @people; #列表context:barney , betty, fred
$number = 42 + @people; #标量context:42+3,得到45
@list = @people; #3 个People 的列表
$n = @people ; #数字3 @backwards = reverse qw / yabba dabba doo /;
#返回doo, dabba, yabba
$backwards = reverse qw/ yabba dabba doo /;
#返回oodabbadabbay $fred = something; # 标量context
@pebbles = something; #列表context
($wilma,$betty) = something; #列表context
($dino) = something; #列表context $fred = something;
$fred[3] = something;
123 + something;
something + 654
if(something){… }
$fred[something] = something; @fred = something;
($fred, $barney) = something;
($fred) = something;
push @fred, something;
foreach $fred(something)
sort something
reverse something
print something
@lines = <STDIN>; #将输入读入列表context 中 子程序:
sub marine {
$n + = 1; #全局变量$n
print “Hello, sailor number $n!\n”; &marine; #输出Hello, sailor number 1!
&marine; #输出Hello, sailor number 2!
&marine; #输出Hello, sailor number 3!
&marine; #输出Hello, sailor number 4! sub sum_of_fred_and_barney{
print “Hey, you called the sum_of_fred_and_barney suroutine!\n”;
$fred + $barney; #返回值
} 子程序中最后一个被计算的表达式为$fred + $barney,因此$fred 和$barney 的和将被返回。下面是一些调用代码:
$fred = 3;
$barney = 4;
$wilma = $sum_of_fred_and_barney; #$wilma 得到7
print “\$wilma is $wilma.\n”;
$betty = 3 * &sum_of_fred_and_barney; #$betty 得到21
print “\n$betty is $betty.\n”; sub larger_of_fred_or_barney {
if ($fred > $barney){
$fred;
}else{
$barney; } $n = &max(10,15); #此子程序有2 个参数 可以写子程序$max,其功能类似于&larger_of_fred_or_barney,但不是使用$fred,而使用($_[0]);不使用$barney,
而使用($_[1])。因此可以如下这些写代码:
sub max{
#和&larger_of_fred_or_barney 比较
If($_[0] > $_[1]){
$_[0];
}else{
$_[1]; }
$n = &max(10,15,27); #oops!
sub max {
my($m,$n); #新的,私有变量
($m,$n) = @_; #赋值
if($m > $n) {$m} else{$n} my($m,$n) = @_; sub max{
if(@_!=2){
print “WARNING! &max should get exactly two arguments!\n”; #continue as before…. . } $maximum = &max(3,5,10,4,6);
sub max {
my($max_so_far) = shift @_;
foreach (@_){
if($_>$max_so_far){
$max_so_far=$_; }
$max_so_far; 而@numbers 可能为空,例如可能从空文件读入。
$maximum = &max(@numbers);
foreach (1..10){
my($square) = $_*$_; #本循环中的私有变量
print “$_ squared is $squrare.\n”; $bamm_bamm = 3; #Perl 自动创建这个变量
$bammbamm + =1; #Oops! 告诉Perl 进行更严格的语法检测,需要在程序顶端use strict(或者在任意块或者文件中,如果你需要在此部分使用它):
use strict; #迫使采用更严格的检测 Perl 将要求你在申明每一个新的变量时,使用my◆:
◆要想知道更多的限制,可以查看关于strict 的文档。文档是按照pragma 的名字来归档的。因此,命令perldoc strict(或者你系统中查看文 ◆当然,还有一些别的声明变量的方法。
my $bamm_bamm=3 ; #新的局部变量
如果,你把它拼写成别的形式,Perl 将警告你,你没有定义如$bammbamm 的变量,因此这类错误在编译时既能发现。
$bammbamm+=1; #没有这样的变量;编译时错误 my@names = qw /fred barney betty dinoWilma pebbles bam-bamm/;
my $result = &which_element_is(“dino”, @names);
sub which_element_is{
my($what, @array) = @_;
foreach(0..$#array){ #@array 元素的索引
if($waht eq $array[$_]){
return $_; #找到既返回 }
-1; #没有找到元素(此处是可选的) 在下例中,其调用的子程序为&shuffle。但它可能是一个内嵌的函数。
my @cards = shuffle(@deck_of_cards); # &是不必要的
如果Perl 内部的编译器知道此子程序的定义,则可以省掉其参数的括号:
sub division{
$_[0] / $_[1]; #第一个参数除以第二个参数 my $quotient = division 355, 113; #可以省略掉括号
sub chomp {
print “Munch, Munch!\n”; &chomp; #此处的&是必须的 假定想得到某个范围内的数字(如范围操作符),从小到大,或者从大到小。范围操作符只能从小到大,但可以很容易的弥 sub list_from_fred_to_barney {
if($fred < $barney) {
#Count upwards from $fred to $barney
$fred ..$banrey
} else {
#Count downwards from $fred to $barney
reverse $barney ..$fred; $fred = 11;
$barney = 6;
@c = &list_from_fred_to_barney; #@c 为(11,10,9,8,7,6) while (defined($line = <STDIN>)) {
print “I saw $line”;
} while(<STDIN>){
print “I saw $_”;
} while (defined($_ = <STDIN>)){
print “I saw $_”;
} foreach(<STDIN>){
print “I saw $_”;
} 另一种方法是使用尖括号◆输入(diamond operator):<>
当程序开始运行运行时,它有0 个或多个调用参数,这由此程序决定。这通常出现在shell 中,此列表由你命令行中输入的内容决定。在
后面将看到,调用程序可以使用许多字符串作为调用参数(invocation arguments)。由于它们经常出现在命令行中,因此有时亦被称作命
令行参数(command-line arguments)。
$ ./my_program fred barney betty 尖括号操作(<>)是一种特殊的行输入操作。其输入可由用户选择◆: while (defined($line = <>)){
chomp($line);
print “It was &line that I saw!\n”; while(<>){
chomp;
print “It was $_ that I saw!\n”; <>操作查看@argv 来决定使用哪些文件
@argv = qw# larry mor curly #; #强制使用这三个文件
while(<>){
chomp; printf 函数有一个格式字符串(format string),后接需要输出的字符串列表。
print “It was $_ that I saw in some stooge-like file!\n”; my @items = qw( wilma dino pebbles );
my $format = “The items are:\n”. (“s\n”x @items);
## print“the format is >>$format<<\n”; #用于调试
printf $format, @items; 文件句柄(filehandle)是Perl 程序I/O 连接的名字,是Perl 和外界的纽带。 Perl 自身有六个文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT◆。虽然可以任意给文件句柄命名, TDOUT 是标准输出流 不需要额外的代价,上述程序能很好的在管道中使用。这是Unix 的另一个概念,可以让我们如下的写命令:
$ cat fred barney | sort | ./your_program | grep something | lpr
你已经见过了Perl 提供的3 种文件句柄:STDIN, STDOUT, STDERR。当需要其它的文件句柄时,使用open 操作通知Perl,
Perl 再请求操作系统来建立同外部的连接。下面是一些例子:
open CONFIG, “dino”;
open CONFIG, “<dino”;
open BEDROCK, “>fred”;
open LOG,“>>logfile”
顶一下
(0)
踩一下
(0)