声明:本神奇的Perl系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载
6.say、print、<STDIN>与Chomp
2个新疑问产生了,这里为什么不用say,好吧,我们通过下面的小例子解释这一切
新建一个perl1-4.txt的文本文件,内容如下:
第1行
第2行
第3行
第4行
我们分别用say和print完成对这个文件的读取
say版本:
#perl1-4.pl
#笔者的ActivePerl安装在d盘下
use 5.010;
open FH,'<./perl1-4.txt';
@mytexts=<FH>;
foreach $mytext(@mytexts){
say $mytext;
}
程序运行结果如下:
第1行
第2行
第3行
第4行
print版本:
#perl1-5.pl
#笔者的ActivePerl安装在d盘下
use 5.010;
open FH,'<./perl1-4.txt';
@mytexts=<FH>;
foreach $mytext(@mytexts){
print "$mytext";
}
程序运行结果如下:
第1行
第2行
第3行
第4行
say版本在每行后输出一个回车换行,因为perl1-4.txt文件本身每行有一个换行符,因此,每读取文件一行就会多输出1行,这也是say和print的主要区别。某些情况下,我们并不需要换行符,即使有换行符也要去掉,有一个函数能帮我们这个忙:chomp。我们打开 perl1-5.txt,可以看到内容如下:
西红柿
黄瓜
丝瓜
冬瓜
白菜
鸡蛋
我们完成一个小任务,将这些人名在一行内输出
#perl1-6.pl
use 5.010;
open FH,'<./perl1-4.txt';
@mytexts=<FH>;
foreach $mytext(@mytexts){
chomp($mytext);
print “$mytext,”;
}
输出如下:
西红柿 黄瓜 丝瓜 冬瓜 白菜 鸡蛋
因为foreach循环一次,从@mytexts中取得下一个元素放在$mytext中,这个过程并不包括删除每个元素的换行符,这个例子中每个元素就是一行,自然包括换行符,所以必须要使用chomp函数去掉末尾的换行符:chomp($mytext)。
Chomp还有一个地方用得最多,就是接受用户输入时。Perl处理用户键盘输入的语句形式如下:
变量=<STDIN>
我们先看一段程序,这段程序的本意是接受用户输入,并将用户和用户的表妹的年纪在一行内显示出来。
#perl1-7.pl
print "你表妹多大了?";
$myinput1=<STDIN>;
print "你今年多大了?";
$myinput2=<STDIN>;
print "你的年纪是$myinput1,";
print "你表妹的年纪是$myinput2。";
$myinput=<STDIN>;
上面程序中的$myinput1=<STDIN>表示接受输入,并将输入的内容赋值给$myinput1。输出结果如下:
你表妹多大了?15
你今年多大了?22
你的年纪是15
,你表妹的年纪是22
程序并没有按想像中的运行,用户和其表妹的年纪在2行内显示出来,因为Perl接受输入,但并不包括清除用户完成输入最后敲入的换行符。因为应去掉$myinput1所含的换行符。程序修改如下:
#perl1-8.pl
print "你表妹多大了?";
$myinput1=<STDIN>;
print "你今年多大了?";
$myinput2=<STDIN>;
chomp($myinput1);
print "你的年纪是$myinput1,";
print "你表妹的年纪是$myinput2";
输出结果如下,任务完成。
你表妹多大了?15
你今年多大了?22
你的年纪是15,你表妹的年纪是22。
7.读取每行的多列数据
上面的例子涉及的都是单列数据,而多数情况下,我们需要读取文件的多列数据。
我从朋友那得到一份北京现代汽车的报价清单,做为消费者,想从中挑选出10-15万的车型,并显示出来。
清单文件为perl1-9.csv,内容如下:
伊兰特 悦动1.6GL手动舒适型2010款,9.98
伊兰特 悦动1.6GL自动舒适型2010款,10.88
伊兰特 悦动1.6GLS手动豪华型2010款,10.98
伊兰特 悦动1.6GLS自动豪华型2010款,11.98
伊兰特 悦动1.8GLS手动豪华型2010款,12.18
伊兰特 悦动1.8GLS自动豪华型2010款,12.98
……
…...
仔细观察可以发现,型号和价格是用“,”分隔,我们再次使用split函数。
#perl1-9.pl
use 5.010;
open CAR,'<.\perl1-9.csv';
foreach $carmes(<CAR>){
($name,$price)=split(',',$carmes);
chomp($price);
say "$name:$price万" if $price<15 and $price>10;
}
close CAR;
程序运行结果如下(……表示以下有若干行省略没列出):
伊兰特 悦动1.6GL自动舒适型2010款:10.88万
伊兰特 悦动1.6GLS自动舒适型2010款:10.98万
伊兰特 悦动1.6GLS自动豪华型2010款:11.98万
伊兰特 悦动1.8GLS手动豪华型2010款:12.18万
伊兰特 悦动1.8GLS自动豪华型2010款:12.98万
……
……