Perl学习之结构控制(流程控制)(0 位领导批示)

一、if else 控制结构

一旦能比较两个值时,就希望能根据这些比较结果作判断。和别的语言类似,Perl中也提供了if控制结构。
如果需要另一种选择,可以使用关键字else。

NOTE:花括号是必须的(这一点和C,php不同)。

二、while 控制结构

while 语句可以循环执行其内部的一块代码直到其条件非真。

条件中真假值的判断和if结构中是一样的。和if控制结构相同,花括号是必须的。判断条件在迭代前执行,如果条件为假,则一次也不执行。

三、foreach 控制结构

foreach 从列表(数组)的第一个元素一直循环执行到最后一个元素,一次迭代一个。


foreach $list (qw/一 二 三/)
{
	print "$list\n";
}

foreach 控制变量每一次迭代从列表中取出一个新值。

全文阅读 »

Perl学习之使用正则表达式处理文件(0 位领导批示)

可以通过正则表达式来改变文本。到目前为止,只介绍过怎么匹配模式。现在,我们将向你演示怎样通过模式来改变字符串中相应地部分。

一、使用s///进行替换

如果将 m// 这个模式匹配看作同文字处理器的 查询(search) 类似的功能,那Perl中 s/// 操作的则类似于 查询并替换(search and replace) 。它将替换变量中模式所匹配上的部分。


$_ ="我喜欢打球";
s/很喜欢/不喜欢/; #很喜欢被不喜欢替换掉
print "$_\n";

如果没有匹配上,则什么也不会发生,此变量也不会有任何更改。

s///会返回一个Boolean 值。如果成功替换则返回true;否则返回false。

1.使用 /g 进行全局替换

在前面的例子中你可能已经注意到,s///值进行一次替换,无论是否还有地方还能匹配上。当然,这只是默认的行为。修饰符 /g 要求s///将不相重叠的所有匹配上的部分都进行替换。


$_ = "哇,好大的棉花糖哇!";
s/哇/哟/g;
print "$_";

全局替换的一个常用地方是将多个空格用单个空格替换掉。

2.不同的分隔符

如同m//和qw//一样,我们也可以改变s///的分隔符。但这里使用了3个分隔符,因此有些不同。
通常的(非配对的)字符,由于没有左字符和右字符的区别,则可以像使用正斜线(/)那样使用。

如果使用的是配对的字符,也就是说其左字符和右字符不的,则必需使用两对:一对存放模式,一对存放替换的字符串。分隔符甚至可以是不同的。

全文阅读 »

Perl学习之正则表达式的应用(0 位领导批示)

一、使用m//匹配

我们曾经将模式放在一对正斜线(//)里面,如/fred/。这是m//(模式匹配)的一种简写。同qw//操作一样,可以使用任何成对的分隔符。
如果使用正斜线(/)作为分隔符,则可以省略掉前面的m。

二、可选的修饰符

有几个修饰符(modifier),通常叫做标记(flag),可以后缀在正则表达式后面来该变其默认的行为。

1.不区分大小写:/i

要创建一个大小写无关的模式,如匹配FRED时,也能匹配上fred, Fred,可以使用修饰符/i。

2.匹配任何字符:/s

默认情况下,点(.)不匹配换行符,这对于 单行中查找 的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹配它们,那可以使用/s 这个修饰符。它将模式中点(.)的行为变成同字符类[\d\D]的行为类似:可以匹配任何字符,包括换行符。

3.添加空格:/x

/x 修饰符,允许你在模式中加入任何数量的空白,以方便阅读。

Perl中,注释可以被作为空白,因此使用/x,可以在模式中加上注释。
#号表示后面是注释,如果需要匹配井号,可以使用\#或[#]。注意不要在注释中使用闭分隔符,否则将结束此模式匹配。

4.将可选字符结合起来
如果在一个模式中需使用不止一个修饰符,可以一个接着一个。其顺序是不重要的。

全文阅读 »

Perl学习之正则表达式(0 位领导批示)

Perl有许多区别于其它语言的特性。在所有这些特性中,最重要的一条是对正则表达式的支持。它允许你方便,快捷的处理字符串相关的问题。
正则表达式(regular expressions)是一种特殊语言写成的程序,内嵌于Perl之中。

一、什么是正则表达式

正则表达式,在Perl中通常被称为模式(pattern):某个模板是否匹配某个字符串。由于存在无限的字符串,某个给定的模式将这些字符串分成两类:一类是能匹配的,一类是不能匹配的。这里没有或者,大概,几乎那样的匹配。要么匹配,要么不匹配。

一个模式可以匹配多个字符串:1个,多个,或者无限个。也可能匹配除了1个,多个,或者无限个字符串之外的所有字符串。我们将正则表达式看作一种由简单语言实现的程序,这种语言只有一个任务:查找某个字符串,返回匹配上(it matches)或者不匹配(it doesnot match)。

二、使用简单的模式

要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间


$_ ="hollo world";
if(/o w/){
	print "it matches";
}

模式匹配通常返回true或false,因此经常用在if或while的条件表达式部分。

全文阅读 »

Perl学习之哈希 hash(0 位领导批示)

一、什么是哈希
哈希是一种数据结构,和数组类似,可以将值存放到其中,或者从中取回值。但是,和数组不同的是,其索引不是数字,而是名字。也就是说,索引(这里,我们将它叫key)不是数字而是任意的唯一的字符串。

key可以是任意的字符串,你可以使用任何的字符串作为key,但它们是唯一的。

另一种思考hash 的方法是,把它看作一堆数据(a barrel of data),每一个数据都有一个相应的标签。可以通过标签访问此标签对应的元素。但其中是没有“第一个”元素的概念的。在数组中,数组元素从0,1,2 开始编号。但在hash中,没有确定的顺序,因此也没有第一个元素。只是一些key/value 对的集合。

keys和values均为任意的标量,但keys通常转换为字符串。因此,如果将表达式50/20 作为keys,则其通常被转换为3字符的字符串“2.5”。

由于Perl的“没有不必要的限制”的设计哲学:hash可以是任意大小,从空hash(没有key/value对),到任何你内存允许的大小。

keys是唯一的,但values可以重复。hash的value可以是数字,字符串,undef,或者它们的混合,但key是唯一的。

为什么使用Hash
可以把hash看作一个简单的数据库,其中每一个key下面可以有一块数据。如果你的任务是关于:“查询重复的”,“唯一的”,“交叉引用的”,“查询表”,则hash很可能在这类应用中帮上你的忙。

二、哈希元素的存取
要访问hash 元素,可以使用下面的语法:$hash{$some_key}

这和访问数组元素的方法有些类似,这里下标(key)上使用的是花括号({}),而不是方括号([ ])。现在key 的表达式是字符串,而非数字。

hash的名字和Perl中其它的标识符的命名规则是一样的(字母,数字,下划线组成,但不能由数字开头)。

访问不存在的hash元素将得到undef。

全文阅读 »

Perl 数列返回所有大于平均值的数字(0 位领导批示)

接上篇的另一道练习

题目要求:
写一个子程序,名为&above_average,将一列数字作为其参数,返回所有大于平均值的数字。


#求平均数
sub average_num
{
	$total;
	foreach $tot (@_)
	{
		$total += $tot;
	}
	return int($total/scalar(@_));
}

#返回大于平均数的数
sub above_average
{
	my $average_num = &average_num(@_);
	my @big_average;
	foreach $ave (@_)
	{
		if($ave > $average_num)
		{
			push(@big_average,$ave);
		}
	}
	return @big_average;
}

my @fred = (1..60);
@array = above_average(@fred);
foreach $view (@array)
{
	print $view."\n";
}

与php的很大不同是子程序参数的使用.@_为传递的默认数组.

NOTE:一般子程序都不用标明返回值.也就是不用写明return..原因是perl语言的发明者不想多打七个字母.-_-!!! 我这里标明也是作为一个php程序员的习惯..

Perl 求从1到一个自然数的和(0 位领导批示)

这是小骆驼书上第四章<子程序>的练习题之一.要求用子程序写出..

我做出了两种方法:

1.常规解法.


sub total
{
	$total;
	foreach $tot (@_) {
		$total += $tot;
	}
	return $total;
}

my @fred = 1..10000;
my $fred_total = &total(@fred);

print $fred_total;

数组循环相加..效率很差-_-!

2.等差数列


sub totalnum
{
	$total = (((1+$_[0])*$_[0])/2);
	return $total;
}

print &totalnum(10000);

NOTE: 和等于 1 加上 最大数 然后乘以最大数 最后除 2

我这里是求出1到10000的和.第2种方法明显优于第1种

Perl学习之列表和数组(0 位领导批示)

如果把标量认为是Perl中的单数的话,那列表(list)和数组则可认为是Perl中的复数。

列表是标量的有序集。数组是包含列表的变量。在Perl 中这个两个术语是可以互换的。但严格意义上讲,列表是指数据,而数组是其变量名。可以有一些值(列表)但不属于数组;但每一个数组标量都有一个列表,虽然其可以为空。

列表中每一个元素都是一个独立的标量值。这些值是有顺序的,也就是说,这些值从开头到最后一个元素有一个固定的序列。数组或者列表中的元素是编了号的,其索引从整数0开始,依次增一,因此数组或者列表第一个元素的索引为0。

由于每一个元素是一个独立的标量值,因此一个列表或者数组可以包含数字,字符串,undef 值,或者任意不同类型的标量值的组合。然而,这些元素的类型通常是一致的。

列表和数组可以包含任意数量的元素。最少含有0元素,最多可以填满你的可用内存。这里又体现了Perl 的设计哲学,“没有不必要的限制”。

1.访问数组元素
于Perl 可以通过索引值来访问元素,如:$array[0] = “test”;print $array[0];

数组名字和标量是属于完全不同的命名空间(namespace)。同一程序也可以同时包含叫做$array的标量变量。Perl将它们当作完全不同的事物来看待,不会混淆。(不建议这么做,容易弄混)

2.特殊的数组索引
如果将一个元素存储在数组最后元素的后面的位置,数组会自动增长的。Perl 没有长度的限制,只要你有足够的内存。如果Perl需要创建元素,则其值为undef。

有时需要知道数组最后一个元素的索引。如 array 数组,其最后一个元素的索引为$#array

一种简便方法:数组的负数索引值从最后一个元素开始。但不要认为这些索引是循环的。如果数组有3 元素,那有效的负数索引值是-1(最后一个元素),-2(中间的元素),-3(第一个元素)。实际上,几乎没有人使用除了-1之外的其它的负数索引值。

全文阅读 »

Perl学习之标量变量(0 位领导批示)

变量是保存一个或多个值的容器。变量的名字在整个程序中保持不变,但其包含的值可以变化。

Perl有三种变量:标量,数组,哈希(hash,又称关联数组)。

分别用不同的前缀表示:标量($),数组(@),哈希(%)。

标量变量可以存放一个标量值。标量变量的名字由一个美圆符号($)后接Perl标识符:由字母或下划线开头,后接字母,数字,或者下划线。或者说由字母,数字和下划线组成,但不能由数字开头。大小写是严格区分的:变量$Fred和变量$fred是不同的。任意字母,数字,下划线都有意义。

1.选择好的变量名。
大多数Perl程序中的变量都是小写的。在少数情况下,使用大写字母。所有字母均大写(如$ARGV)通常表明这个变量有特殊的地方。

2.标量赋值
Perl中的赋值符是等号,将等号右边的值赋给等号左边的变量。

3.二元赋值操作符
像$fred=$fred+3(同一个变量在赋值符两边出现)这样的表达式在Perl 中经常出现(同C 和Java 类似),因此Perl 提供了一种简便的替代方法:二元赋值操作符。
如:$fred=$fred+3 和 $fred+=3 是等价的
几乎每一个二元操作符都有一个等价的二元赋值形式:由这个符号后接等号组成。

Perl学习之标量数据(0 位领导批示)

标量是Perl 中最简单的数据类型。大多数的标量是数字或者字符串。你也许把数字和字符串看作不同的事物,但Perl 几乎以相同的观点来看待它们。

标量数据可有操作符(如相加和串联),通常会产生一个新的标量数据。标量数据的值可以存放在标量变量中。标量可以从文件或设备读取,也可以写进去。

一 数字

1.浮点数
数字符号(literal)是Perl程序源代码中代替某个值的方法。数字符号不是计算或I/O操作的结果,它是直接写进代码中的数据。你可能已经很熟悉Perl 的浮点数。有或没有小数点的数字都是允许的(包括+或-号),也可带一个十进制的指数(符号为E)

2.整数

3.非十进制整数
同许多其它语言一样,Perl 也允许使用非10为底的数字。八进制以0开头,十六进制以0x开头,二进制0b开头。在十六进制中A到F(或者a 到f)分别表示10到15。
当一个非十进制的数字超过4位时,读起来将很困难,Perl 允许你使用下划线来区分。

全文阅读 »

随机显示的10篇日志

评论最多的10篇日志

浏览最多的10篇日志