欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

perl处理输入和输出-3

程序员文章站 2022-04-29 16:23:43
...

声明:本神奇的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的文件处理原则,>>表示在原有内容上增加。

 

 

 

相关标签: Perl F# D语言