设为首页 收藏本站
查看: 1000|回复: 0

[经验分享] perl处理输入和输出-3

[复制链接]

尚未签到

发表于 2017-5-19 07:09:05 | 显示全部楼层 |阅读模式
  声明:本神奇的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的文件处理原则,>>表示在原有内容上增加。

  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378864-1-1.html 上篇帖子: Javascript和Perl split方法之细微差异 下篇帖子: 神奇的perl-第六个任务(8)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表