声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载
这段程序有几处耐人寻味:
1、($name,$price)=split(',',$carmes);
($name,$price)表示一个列表,列表可以理解为标量的有序集合,列表
存储着数据的集合,而数组可理解为存储着列表的变量。列表可用用(元素
1,元素 2,元素 3,„..,元素 n)的方式表示。这句代码完成一个功能把等
号右边分隔的每个元素赋值给左边的列表,其中第 1 个元素给$name,第二
个元素给$price。
2、chomp($price);
$price难道会包括换行符?这是初学者最容易忽视的问题:文件中每行只有2个元素,最后一个元素(也就是第二个元素)的末尾包括换行符。
3、foreach $carmes(<CAR>)
从CAR文件句柄中读取数据给$carmes变量,每循环一次读取一行,也可以如下书写:
@mytext=<CAR>;
foreach $carmes(@mytext){
……
}
4、say "$name:$price万" if $price<15 and $price>10;
想必大家对if语句并不陌生,这是if的一种特殊用法,此语句的含义表示:如果$price<15并且$price>10,则执行say "$name:$price万"语句。关于if,我们将在下一章详述。
8.写文件
Perl写文件的方式非常简洁,使用以下2种形式:
say 文件句柄 内容
print 文件句柄 内容
把Perl1-9的代码稍加修改,将10万到15万之间车写入另一个CSV格式文件中。
#perl1-10.pl
use 5.010;
open CAR,'<.\perl1-9.csv';
open CAROUT,'>.\perl1-10.txt';#以写入方式打开文件perl1-10.txt
foreach $carmes(<CAR>){
($name,$price)=split(',',$carmes);
chomp($price);
say CAROUT "$name:$price万" if $price<15 and $price>10;#写文件
}
close CAR;
9.带格式输出Sprintf和printf
Sprintf返回格式化后的字符串,语法如下:
sprintf(“格式”,要格式的字符串列表)
格式主要有以下几种:
%% 百分号
%c 把给定的数字转化为字符
%s 字符串
%d 带符号整数,十进制
%u 无符号整数,十进制
%o 无符号整数,八进制
%x 无符号整数,十六进制
%e 浮点数,科学计算法
%f 浮点数,用于固定十进制计数
%g 浮点数,包括%e和%f
printf等同于以下语句:
print sprintf(“格式”,要格式的字符串列表);
我们使用sprintf,以元为单位输出10万到15万的车的价格列表。
#perl1-11.pl
use 5.010;
open CAR,'<.\perl1-9.csv';
foreach $carmes(<CAR>){
($name,$price)=split(',',$carmes);
chomp($price);
say $name.':'.sprintf(“%d”,$price*10000) if $price<15 and $price>10;
# $price*10000完成将万元转换成元
}
close CAR;
10.join
split和join函数在处理文本时经常使用,join的功能与split相反,它将列表中用逗号分隔的字符串元素连接成单个字符串,并返回这个字符串,调用格式如下:
变量=join(分隔符,字符串元素列表);
我们将perl1-11.pl修改一下,从perl1-9.csv中提取价格在10万到12万之间的汽车,输出为另一个CSV格式文件。
#perl1-12.pl
use 5.010;
open CAR,'<.\perl1-9.csv';
open CAROUT,'>.\perl1-11.csv’;以写入方式打开文件perl1-11.csv
foreach $carmes(<CAR>){
($name,$price)=split(',',$carmes);
chomp($price);
say CAROUT join(‘,’,$name,sprintf(“%d”,$price*10000))
if $price<12 and $price>10;
# $price*10000完成将万元转换成元
}
close CAR;
close CAROUT;
注意下面这个语句:
say CAROUT join(‘,’,$name,sprintf(“%d”,$price*10000))
if $price<12 and $price>10;
因为csv格式每行元素之间以逗号分隔,所以使用逗号做为分隔符,将$name和格式转换后的$price连接为单个字符串输出到CAROUT文件句柄中。
11.转义字符表示
Perl的主要转义字符如下:
结 构 含 义
\n 换行
\r 回车
\t 水平置表符
\f 换页符
\b 退格
\v 垂直置表符
\a 响铃
\e Esc
\007 任一八进制ASCII值(这里007表示bell)
\x7f 任一十六进制ASCII值
\cC 任一“控制”字符
\\ 反斜杠
\" 双引号
\l 下一字母小写
\L 以后所有字母小写直到\E
\u 下一字母大写
\U 以后所有字母大写直到\E
\E 结束\L和\U
12.硬引用、指针
Perl没有像C语言一样的可直接操纵内存的指针,但有类似于指针的的引用(也称为硬引用)。引用是一种标量,含有其他类型数据的地址,可把它理解为一个内容为地址值的变量。
在perl里面使用“\”来创建引用;使用$解引用后,可使用引用指向的标量;使用@解引用,使用引用指向的数组;使用%解引用后,使用引用指向的哈希。这些使用方式具备修改权力,如:
#perl1-13.pl
$hello="hello";
$myhello=\$hello;
print "$myhello\n";#输出$hello地址
print "$$myhello\n";#输出$hello变量内容
$$myhello="hello!";#通过$myhello引用修改$hello变量的值
print "$hello\n";#输出$hello变量内容
输出结果如下:
SCALAR(0x182a6f4)
hello
hello!
这个程序中,$myhello存有$hello的地址,存有$hello变量的地址,通过$myhello能直接操作$hello,而不是操作$hello的复制版本。
符号引用(也称为软引用)操作符为$,相当于宏替换,如以下代码中, $$var相当于取$var的内容为变量名,完成宏替换,最终表示$name。
$var="name";
$$var="张三";
print "$name\n";
输出结果为
张三
13.完成第一个任务
这一章要结束了,输入输出基础介绍完了,能完成本章开始时提出的任务了,将Perl1-2.txt中的人员按城市分别存为几个文本文件,文件名是城市名。
#perl1-14.pl
use 5.010;
open PEOPLE,'<.\perl1-2.txt';
$mytext=<PEOPLE>;
@peoples=split('#', $mytext);
foreach $peoplemes(@peoples){
($name,$age,$city)= split(',',$peoplemes);
chomp($city);
open CITY,">>$city.txt";
say CITY join(',',$name,$age,$city);
close CITY;
}
close PEOPLE;
请大家注意这个语句:open CITY,">>$city.txt";
打开文件的方式使用的是增加方式。根据Perl的文件处理原则,>>表示在原有内容上增加。
分享到:
相关推荐
2. **Perl处理输入输出**:这部分深入讲解了如何使用Perl进行文件操作,包括打开、读取、写入和关闭文件,以及处理标准输入输出和重定向。还涵盖了处理命令行参数和环境变量的方法,使读者能够编写更实用的脚本。 3...
3. **验证安装**:打开命令提示符,输入`perl -v`,如果显示出Perl的版本信息,说明安装成功。 4. **开始编程**:现在你可以开始编写Perl脚本了。创建一个扩展名为`.pl`的文件,写入一些简单的Perl代码,如`print ...
-n选项使得Perl在处理输入文件的每一行时会执行指定的代码块,但不会自动打印每行。该选项通常和后面的代码块配合使用,例如: ```perl $ ls -lAF | perl -nle 'print if -f $_' ``` 上面的命令会输出当前目录下所有...
Perl是一种强大的脚本编程语言,尤其在文本处理和系统管理任务中广泛应用。在Perl中,`printf`函数家族是用于格式化输出的...如果你正在处理涉及用户输入和`printf`函数的Perl代码,这份文档将是一份宝贵的参考资料。
Perl是一种强大的脚本编程语言,尤其在文本处理和系统管理任务方面表现突出。要了解如何使用Perl以及它的基本用法,我们首先需要安装Perl解释器,通常可以在官方网站`www.perl.org`上找到对应操作系统的版本。安装...
这个变量的用途通常是处理输出文本的页面布局,但它在代码中的具体含义并没有在片段中详细说明。 3. Perl中的常量创建: 在Perl中创建常量可以通过定义一个返回特定值的子程序来实现,例如通过定义一个sub PI {......
在Perl中,与文件和输入/输出流打交道非常简单。文档会介绍打开、关闭文件、读写操作,以及文件处理函数如fopen、fclose、feof等。 7. **模块和CPAN** Perl拥有一个庞大的标准库和第三方模块库CPAN...
- 使用Perl处理命令行参数。 - **第5天:正则表达式** - 正则表达式的语法。 - 在Perl中匹配和替换字符串。 - 实战案例:文本分析与过滤。 #### 第二部分:高级主题 - **第6天:模块与包** - 模块的概念及其...
这些变量在很多常见任务中都发挥着关键作用,例如输入/输出控制、错误处理和程序控制。 8. **perlmod.htm**:Perl 模块系统介绍,包括如何创建、使用和发布模块,以及如何利用 Moose 或其他工具进行面向对象编程。...
3. 安装完成后,可以通过命令行输入 `perl -v` 验证安装。 ##### 对于 Unix/Linux 用户: 1. 访问 [Perl 官方网站](http://www.perl.com/pub/language/info/software.html#stable) 获取最新版本。 2. 使用以下命令...
4. **文件和I/O操作**:学习如何读写文件,处理输入/输出流,以及使用各种文件测试操作符检查文件状态。 5. **模块和CPAN**:Perl的模块系统允许开发者复用代码,提高效率。CPAN(Comprehensive Perl Archive ...
脚本使用 Perl 的文件处理函数 open 和 close 来处理输入文件和输出文件,然后使用输入记录分隔符来读取 FASTA 文件中的序列数据。最后,使用 Perl 的 tr 函数来计算反相互补序列,并将结果输出到输出文件中。 知识...
3、肯定的和否定的预见匹配 4、模式注释 第七章 控制结构 一、条件判断 二、循环: 1、while循环 2、until循环 3、for循环 4、针对列表(数组)每个元素的foreach循环 5、do循环 6、循环控制 7、传统的...
- `-u`: 打开标准输入输出为未缓冲的。 - `-U`: 关闭标准输入输出的缓冲。 - `-v`: 显示版本信息。 - `-h`: 显示帮助信息。 - `-V`: 显示配置变量。 - `-c`: 检查程序语法但不执行。 - `-d`: 启动调试器。 -...
- 输入/输出操作 2. **PERL语法特性** - 注释和代码格式化 - 条件语句(if/else,switch/case) - 循环结构(for, while, until) - 函数定义与调用 - 错误处理与异常处理 3. **字符串和正则表达式** - ...
内置函数涵盖了字符串处理、正则表达式、数字运算、数组和列表操作、哈希处理以及输入/输出控制等方面的功能。 #### 引用与解引用 - **标量引用**:指向一个标量值的引用。 - **数组引用**:指向数组的引用。 - **...
4. **输入/输出**:标准输入、输出和错误处理,以及重定向和管道操作。 5. **模块的使用**:介绍如何安装和使用CPAN上的模块,以及编写自己的模块。 6. **面向对象编程**:讲解如何创建和使用Perl的类和对象。 7. **...
- 标准输入输出:`<>`从键盘或文件读取,`print`向屏幕或其他文件输出。 4. **模块**: - CPAN(Comprehensive Perl Archive Network)是Perl模块的仓库,提供成千上万的预编译模块,方便开发者复用代码。 - `...