3.2 Perl--输入和输出

前面已经提到$line=,@line=,即可以过多键盘输入的东西进入到程序中去运行。

<>是另一种读取的方式,钻石操作符是行输入操作符的特例,它不是从键盘输入,而是从用户指定的位置读取。

while(defined($line=<>)){
chomp($line);
print "It was $line that I saw!\n";
}

也可以简写为

while(<>){
chomp;
print"It was $_ that I saw!\n";

钻石操作符是用来读取输入的,而输入的内容可以在$_中找到。 钻石操作符会先查看数组@ARGV,然后决定该用那些文件名,如果它找到的是空列表,就会改用标准输入流,例如在前面的程序中加入@ARGV=“”,它就只会去读这里面的文件了。

print @arrary;
print "@arrary";

第一个print语句会一个接一个地打印出数组中的所有的元素,元素之间不会有空格,比如@arrary=qw”fred barney betty”,第一个语句输出的是fredbarneybetty,而第二个输出的是空格隔开的fred barney betty.

如果有换行符,建议还是用第一种,

如果不含换行符,用第二种,当然后面可以加\n

printf操作符的参数包含“格式字符串”以及“要输出的数据列表”

例如:

printf "Hello,$s;your password expires in %d days!\n",$user,$days_to_die;

出来的结果是:

Hello,merlyn;your password expires in 3 days!

最常用的格式:

恰当的数字格式:

printf "g% %g %g\n",5/2,51/17,51**17 # %g会按需要自动选择浮点数,整数甚至指数形式
print "in %d days !\n",17.58          #%d代表十进制的整数,无条件的曲调小数点后面的数字

字符的格式:

printf "m\n",42          #输出的结果看起来像····41(其中·代表空格)
printf "s\n","wilma";   #看起来像·····wilma
printf "%-10s\n","wilma";  #负号是左对齐,结果为wilma·····
printf ".3f\n",6*7+2/3  #%f按需要四舍五入,可以指定字段宽度和小数点位数结果为                                                ······42.667 

要输出真正的%,请用%%

print"%.2f%%\n",5.25/12;      # 结果为0.44%

数组的格式:

$format="The items are :\n".("%${width}s\n"x@string);  #${width}为变量指定的字符宽度,为了         printf $format,@string;格式:                               避免混淆,加了{}

文件句柄

代表perl进程与外键之间I/O联系的名称,仅仅是联系的房产,不是文件的名称。

建议用全大写字母来命名文件句柄。跟已有的文件句柄:STDIN,DTDOUT,STEERR,DATA,ARGV,ARGVOUT不要重名,其他的可以选择自己喜欢的名字。

方式1:

perl tac2 <> uuu 

方式2

./tac2  <>  uuu

其中tac2为写的脚本, <>中的m为输入的文件 ,uuu为你存放生成的结果的文件名,可以自己取名字。

打开文件句柄:

open CONFIG,'dino';
open CONFIG,'
open BEDROCK,'.fred';
open LOG,'>>logfile';

第一行打开名为CONFIG的文件句柄,让它指向文件dino,也就是打开文件dino,文件中的任何内容都可以从文件句柄CONFIG被督导我们的程序中来。

第二行申明此文件用来读取的,而非写入的

第三行用来创建一个新的文件,打开文件句柄BEDROCK,并输入到新的文件fred中,如果已有该文件,就清除重新建

第四行用来追加的方式打开文件,

open的三个参数形式:

open CONFIG,'<','dino';
open BEDROCK,'>',$file_name;
open LOG,'>>',&logfile_name();

这种写法的好处就在于,可以在文件操作模式后面加上冒号,写上编码名称

open CONFIG,'<:encoding(UTF-8)','dino';

关闭文件句柄

close BEDROCK;

通知系统将尚未写入的输出数据写到磁盘,显得工整一些

改变默认的文件输出句柄:

select LOG;    #选择LOG作为输出的文件句柄
$| =1;         #输出操作之后立刻刷新缓冲区
select STDOUT; #回复到默认的输出文件句柄STDOUT;
print LOG "This is very good!\n";

例1:反向输出

#! /usr/bin/perl
use warnings;
use strict;
use 5.010;
my @line=<>;
chomp @line;
my @b=reverse(@line);
print "@b\n";

当我在终端运行这个:perl tac m n (m,n为保存有字符串的文件)

为什么没有反向输出的效果呢?求解

当把里面的@改成$后,可以对单个文件处理,反向输出,这是个什么原因呢?

例2:用户自定义输出的字符宽度:

#! /usr/bin/perl
use warnings;
use strict;
my $width;
print"Please enter the number of size,the enter Ctrol +D to end:\n";
$width=<>;
chomp $width;
print"please enter the string,the enter Ctrol +D to end:\n";
my @string=<>;
chomp @string;
my $format="%${width}s\n"x@string;
printf $format,@string;

这个例子 我比较喜欢,我弄出来的

ps:

  1. 上面的方法尽管参考,方法肯定不止一个
  2. 如果跟我一样是菜鸟,请结合我的第一篇博客看如何运行这样的脚本。
  3. 博文内容为整理的《Perl语言入门》这本书,感谢这个书的作者Randal L等人的付出
个人公众号,比较懒,很少更新,可以在上面提问题:

更多精彩,请移步公众号阅读:

Sam avatar
About Sam
专注生物信息 专注转化医学