声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载
我们先放松想像一下:你是公司一个普通的开发人员,一大早,阳光明媚,你急不可待打开QQ,跟最近泡上的MM聊天。此时项目组长急勿勿过来了,交给你一个紧急任务,将perl1-2.txt中的人员按城市分别存为几个文本文件,文件名是城市名,文本内容如下:
刘欢欢,20,长沙#冯军,25,上海#李兵,21,北京#李军,23,北京#李志,27,北京#黄王兵,29,长沙#赵兵,22,上海#李强兵,25,上海。。。。。。。
你不禁倒吸一口凉气,天呀,又要编写一大堆代码来完成这个任务,而且还要读写文件,好久没操作文件IO了,有些命令都忘了。你也许足够聪明,想到干脆把perl1-2.txt导入到数据库中,然后运行SQL查询,按城市生成不同的表再导出,很快你打消这个念头,工作量大,如果城市众多,手工将生成的表导出几乎不可能。用C、C++、Pascal、java等高级语言确实完成这个任务,但代码量较大,使用Perl,10多行就能搞定。请允许我在此卖个关子,我们先了解一下Perl的输入输出基础,回头再来解决这个任务。
Perl语言具有以下基本特点:
1、Perl用#表示后面的内容为注释。
2、Perl语句用;表示结束。
3、Perl程序通常以pl结尾,如果是做为Apache容器中的cgi程序来执行脚本,必须为脚本文件名提供.pl或.cgi扩展名。
4、Perl对变量的表示方式非常简洁:
1)Perl不要求变量有类型。
2)对于数组、列表,采用以@后接变量名表示,比如@names。
3)对于保存单个值的变量,采用$后接变量名表示,称之为标量,比如$name。
4)对于哈希变量,采用%后接变量名表示。
5、你可以选择这种方式执行Perl程序,在命令行中输入:
perl 程序名
Perl的文件处理很简单,只需掌握以下2个原则:
1、打开文件使用open,关闭文件使用close,使用print向文件输出内容。
2、>表示写,<表示读,>>表示在原有内容上增加,Perl使用这几个符号来表示对文件的处理方式。
比如:
1)读取文件(FH表示文件句柄,以下几个例子均是):
open (FH,“<文件名”);
2)写入文件,写入之前,如果文件已经存在,则删除它,重新建立一个新的。
open (FH,“>文件名”);
3)打开一个文件并增加内容。如果文件不存在,则建立一个文件再打开。如果已经存在则直接打开。
Open (FH,”>>文件名”);
3、关闭一个文件
Close (FH);
我们首先试试看能不能按每人每行来读取并显示文件内容
use 5.010;
open FH,'<.\perl1-2.txt';
$mytext=<FH>;
@peoples=split '#',$mytext;
foreach $people(@peoples){
say $people;
}
close FH;
运行一下,效果不错
刘欢欢,20,长沙
冯军,25,上海
李兵,21,北京
李军,23,北京
李志,27,北京
黄王兵,29,长沙
赵兵,22,上海
李强兵,25,上海
我们来解释一下这段perl程序:
第1行:use后接perl的版本号,表示使用perl5.1。
第2行:打开一个文件,并给予一个文件句柄,Perl对文件的处理方式是操作文件句柄,而不直接操作文件名,你可以把它理解为一个文件的别名。根据Perl的文件处理的第2个原则,perl1-2.txt表示处理的文件名,<是处理方式为读取。open的调用方式为open 句柄,处理方式后接文件名
第3行:这一行表示打开FH文件句柄所代表的文件,然后,把文件内容赋值给$mytext变量。
第4行:从变量名的前缀@可以看出@peoples是一个数组,那么split('#', $mytext)是什么?split是一个函数,这个函数的功能是从$mytext变量的文本中取得被#分割的部分,即每个人的具体情况,每个部分做为数组的一个元素。
第5行:foreach表示从一个循环,在循环中每次从@peoples数组中取得一个元素值给$people,
第6行:循环体,唯一的任务就是将每个取得的元素打印出来,因为这些元素已经放在$people中了。say和print的不同之处在于:say在输出时会在结尾处加上一个换行,print不会。如果使用print,可以将say $people;改成print “$people\n”;
细心的你一定发现了 “$people\n”这种写法,$people不是变量名吗,怎么能直接放在双引号中呢,Perl管这个叫变量内插,在双引号的变量最后会以变量值表示。
第7行:循环结束
第8行:表示关闭文件句柄FH。
等等,还有问题,单引号呢?除了双引号,单引号也可以表示字符串呀,答案是单引号内的变量不会内插,会直接以变量名表示。最后一个小提示,在Perl字符串的连接可以使用小数点符号.解决。如:“hello,”.’”’world”表示’”’helloworld”。
这节结束之前我们把上面代码改一下,看看单引号和双引号的区别:
use 5.010;
$|=1;
open FH,'<.\perl1-2.txt';
$mytext=<FH>;
@peoples=split '#',$mytext;
foreach $people(@peoples){
print '$people:'."$people\n";
}
close FH;
从以下运行结果可以看出,单引号直接将变量名显示出来了。
$people:刘欢欢,20,长沙
$people:冯军,25,上海
$people:李兵,21,北京
$people:李军,23,北京
$people:李志,27,北京
$people:黄王兵,29,长沙
$people:赵兵,22,上海
$people:李强兵,25,上海
从上面程序中,你也许看出来了:
1、“=”这个符号太神奇了,后面接文件句柄,就能读取文件
$mytext=<FH>;
但是,上面这个语句只适于文件只有一行的情况(所谓一行是指从行首一直到换行符为止),因为$mytext是标量,只能保存一个元素。 文件超过一行,应使用数组方式:
@myext=<FH>;#Perl返回所有内容给@mytext,数组每个元素是文件的一行。
2、foreach更神奇了,可以自动从数组中抽取元素。
foreach $people(@peoples){
say $people;
}
学以致用,我们尝试一下:读取ActivePerl目录下的Copyright.html。
#perl1-4.pl
#笔者的ActivePerl安装在d盘下
use 5.010;
open FH,'<D:/Perl/html/Copyright.html';
@mytexts=<FH>;
foreach $mytext(@mytexts){
print $mytext;
}
网页文件成功显示了:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="./displayToc.js"></script>
<script language="JavaScript" src="./tocParas.js"></script>
<script language="JavaScript" src="./tocTab.js"></script>
<title>Welcome to ActivePerl</title>
<link rel="stylesheet" href="Active.css" type="text/css">
</head>
分享到:
相关推荐
1. **Perl脚本的基本结构** - 每个Perl脚本以`#!/usr/bin/perl`或类似路径开头,这是Shebang行,告诉系统使用哪个解释器来执行文件。 - 接下来,可以使用`use strict;`和`use warnings;`来开启严格的语法检查和...
-n选项使得Perl在处理输入文件的每一行时会执行指定的代码块,但不会自动打印每行。该选项通常和后面的代码块配合使用,例如: ```perl $ ls -lAF | perl -nle 'print if -f $_' ``` 上面的命令会输出当前目录下所有...
3. **验证安装**:打开命令提示符,输入`perl -v`,如果显示出Perl的版本信息,说明安装成功。 4. **开始编程**:现在你可以开始编写Perl脚本了。创建一个扩展名为`.pl`的文件,写入一些简单的Perl代码,如`print ...
在Perl中,与文件和输入/输出流打交道非常简单。文档会介绍打开、关闭文件、读写操作,以及文件处理函数如fopen、fclose、feof等。 7. **模块和CPAN** Perl拥有一个庞大的标准库和第三方模块库CPAN...
Perl是一种强大的脚本编程语言,尤其在文本处理和系统管理任务中广泛应用。在Perl中,`printf`函数家族是用于格式化输出的...如果你正在处理涉及用户输入和`printf`函数的Perl代码,这份文档将是一份宝贵的参考资料。
4. **文件和I/O操作**:学习如何读写文件,处理输入/输出流,以及使用各种文件测试操作符检查文件状态。 5. **模块和CPAN**:Perl的模块系统允许开发者复用代码,提高效率。CPAN(Comprehensive Perl Archive ...
8. **文件输入/输出**:Perl提供了简单易用的文件处理功能,包括打开、读取、写入和关闭文件,以及文件指针和缓冲区的概念。 9. **数组和哈希操作**:了解如何创建、遍历、修改和操作数组和哈希,是处理复杂数据...
Perl提供了丰富的文件和输入/输出(I/O)函数,可以方便地读写文件、处理标准输入输出。例如,下面的代码会读取并打印一个文件的内容: ```perl open(my $fh, ', 'filename.txt') or die "Cannot open file: $!"; ...
3. 安装完成后,可以通过命令行输入 `perl -v` 验证安装。 ##### 对于 Unix/Linux 用户: 1. 访问 [Perl 官方网站](http://www.perl.com/pub/language/info/software.html#stable) 获取最新版本。 2. 使用以下命令...
4. **输入/输出**:标准输入、输出和错误处理,以及重定向和管道操作。 5. **模块的使用**:介绍如何安装和使用CPAN上的模块,以及编写自己的模块。 6. **面向对象编程**:讲解如何创建和使用Perl的类和对象。 7. **...
内置函数涵盖了字符串处理、正则表达式、数字运算、数组和列表操作、哈希处理以及输入/输出控制等方面的功能。 #### 引用与解引用 - **标量引用**:指向一个标量值的引用。 - **数组引用**:指向数组的引用。 - **...
### 知识点三:输入输出处理 #### 第一个Perl任务 - 通过读取文件、处理数据并输出结果来完成第一个任务。 #### 文件处理原则 - 使用文件句柄(如`$fh`)打开文件,使用`open`函数。 - 读取文件通常使用`<>`操作...
- 使用Perl处理命令行参数。 - **第5天:正则表达式** - 正则表达式的语法。 - 在Perl中匹配和替换字符串。 - 实战案例:文本分析与过滤。 #### 第二部分:高级主题 - **第6天:模块与包** - 模块的概念及其...
- 标准输入输出:`<>`从键盘或文件读取,`print`向屏幕或其他文件输出。 4. **模块**: - CPAN(Comprehensive Perl Archive Network)是Perl模块的仓库,提供成千上万的预编译模块,方便开发者复用代码。 - `...
从给定的文件信息来看,这是一份关于Perl语言入门的教程,主要涵盖了Perl语言的基础知识、数据类型、控制结构、子程序、输入输出以及哈希等核心概念。以下是对这些知识点的详细解析: ### 一、Perl语言简介 #### ...