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

Perl处理输入输出-2

程序员文章站 2022-04-29 16:26:48
...

声明:本神奇的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万
……
……
 

 

 

相关标签: Perl