您的位置:首页 > 其它

perl-标准输入与输出

2016-01-06 21:17 323 查看
-1-----------------------------------------------------------------------------------------------------
标准输入与输出:
<STDIN> #标准输入
<STOUT>  #标准输出
<STDERR>  #标准错误输出

来自钻石的捷操作符的输入:
<> 它能让程序在处理调用参数时,提供类似标准的unix工具程序的功能。
如果你想编程类型类似cat sed awk sort grep 等工具就可以使用<>操作符。

钻操作符是行输入的操作符的特列。不过它并不是从键盘取得输入,而是从用户指定的位置读取
while(defined (my $line = <>))
{
chomp($line);
print "It was $line that I saw!\n";
}

调用参数 :
从技术角度来看,钻石操作符其实不会去检查命令行参数,它的参数其实不过是来自@ARGV数组。这个数组是由perl
解释器事先建立的特殊数组,其内容就是由命令行参数组成的列表。

钻石操作符会查看数组@ARGV,然后决该用哪些文件名,如果它找到是空列表,就会改用标准的输入流;否则,就会
使用@ARGV里的文件列表。

@ARGV=qw/ test1 test2 test3/;
while(<>)
{
chomp;
print "I saw $_ that I saw in some stooge-like file!\n";
}
-1-----------------------------------------------------------------------------------------------------

-2------------------------------------------------------------------------------------------------------
输出到标准输出:
print 操作符会读取到列表中的所有元素,并把每一项依次送到标准输出。

print "test\n";

my @test=qw(test1 test2 test3);
print "@test\n"; #输出结果test1 test2 test3
print @test;     #输出结果test1test2test3

一般情况下,程序的输出结果都会先被送到缓冲区。也就是不会每当有一点点输出就直接送出去,而是先积攒起来,
直到数量够多时才造访外部设备。

这样做的原因是:举例来说,当输出结果要存到磁盘时,只为了添加一两个字符到文件结尾就去访问磁盘,(相对来讲)这样即慢又
没效率。因此,输出的结果通常会先被送到缓冲区,等到缓冲区满了或在输出结束时(例如程序运行完毕),才会将它的刷新(flush)
到磁盘(也就是实际写到磁盘,或者其他地方)

-2------------------------------------------------------------------------------------------------------

-3------------------------------------------------------------------------------------------------------

用printf格式化输出:
printf 操作符的参数包括"格式字符串" 及"要输出的数据列表"。

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

要输出恰当的数字形式,可以使用%g,它会按需要自动选择浮点数,整数甚至是指数形式:
printf "%g %g %g\n",5/2,51/17, 51**17;

十进制形式输出数字:
printf "%d\n", 17.85;  #整数,会舍去小数部分

字符串形式输出:
printf "%10s\n","wilma";  #向右对齐
printf "%-10s\n","wilma";  #向左对齐

浮点数格式输出(按四舍五入):
printf "%12f","123.4567";
printf "%12.3f", "123.345678"; #小数位保留三位

-3------------------------------------------------------------------------------------------------------

-4------------------------------------------------------------------------------------------------------
文件句柄:
什么是文件句柄?
文件句柄(filehand)就是程序代表perl进程(process)与外界面的I/O联系的名称。

在perl5.6之前的,所有的文件句柄都是裸字(bareword),而从5.6起,我们可以把文件句柄的引用放到常规的标
量中。

文件句柄的命名:必须以字母,数字开头,但不能以数字开头。(建议文件句柄的全用大写)

perl有6个特殊文件句柄名是perl保留的:STDIN,STDOUT,STDERR,DATA,ARGV以及ARGVOUT
-4------------------------------------------------------------------------------------------------------

-5------------------------------------------------------------------------------------------------------
打开文件句柄和:
open CONF,'dino';   #读取一个文件
open CONF,'<dino';  #同上

open BLOCK,'>fred';  #写入
open LOG,'>>logfile'; #重定向输入

加下编码形式读取或写入

open CONFIG,'<:encoding(UTF-8)','dino'; #以UTF编码读取文件

open DEDROCK, '>:encoding(UTF-8)','dino';
open LOG,'>>:encoding(UTF-8)','logfile';

以二进制方式读写文件句柄:

在以前比较旧的的perl版本中,如果不希望转换换行符,比如某个二进制文件恰好有一段字节
和换行符的内码相同,可以binmode关闭换行符相关处理。
binmode STDOUT;  #不要转换行符
binmode STDERR;  #不要转换行符

从perl5.6开始,你可以在binmode的第二个参数的位置上指定层。如果你希望输出Unicode到STDOUT,
就是要确保STDOUT知道如何处理它拿到的数据:

binmode STDOUT,':encodeing(utf8)';

如果没有这做的话,就会得到警告,因为STDOUT不知道如何处理编码上的问题:
Wide character in print at test line 1.

输入也可使用:
binmode STDIN,':eoncoding(utf8)';

处理有问题的文件句柄:
my $success = open LOG,'>>', 'logfile' #捕获返回值
if(! $succ
c508
ess)
{
#open failed
....
}

关闭文件句柄:
close(filehand); #perl在程序结束时,会自动关闭文件句柄。

所谓的关闭文件句柄,就是让perl通知操作系统,我们对数据流的处理已经全部完成,所请
系统将尚未写入的输出数据写到磁盘,以免有人等着用。

-5------------------------------------------------------------------------------------------------------

-6------------------------------------------------------------------------------------------------------
异常处理方法

用die处理致命错误:
die函数会输出你指定的信息到专为这类信息准备的标准错误流中,并且让你的程序立刻终止并返回
状态不为0的的退出码。

结束状态码:
其实只用一个字节来表示,所认它能的传递的信息不多。传统上,零代表成功,非零代表失败。
也许"1"代表参数的语法错误,"2"代表处理某程序时发生了错误,"3"代表找不到某个配置文件。
"0" 一定是代表成功完成。

if(!open LOG,">>",'logfile')
{
die "Cannot create logfile:$!\n";  #无法做创建文件程序终止并抛出错误
}

$! 变量用来存储错误信息。

用warn送出警告信息
warn 和 die 功能一样的,不过在最后一步操作是不同的,warn不会终止程序

if(! open LOG,'>>','logfile')
{
warn "Cannot create logfile:$!\n";
}
-6------------------------------------------------------------------------------------------------------

-7------------------------------------------------------------------------------------------------------
使用文件句柄

open(PASS,"<",'/etc/passwd')
or die "Cannt open the '/etc/passwd':$!\n";

while(<PASS>) #读取文件句柄的内容
{
print "$_\n";  #输出信息
}

改变默认的文件输出句柄:
默认情况下,假如你不为print(或 print,我们下面的两者都有效)指定文件句柄,它的输出就会送到STDOUT.
但我们可以使用select操作符来改变默认的文件句柄。

select BEDROCK;
print "I hope Mr. Slate doesn't find out about this.\n";
print "Wilma\n";
一旦选择(select)输出用的默认句柄,程序就会一直向那里输出。但是这么很容易使用余下程序
变得混淆,这并不是一个好办法。因此你指定的默认文件句柄使用完毕后,最好把它设置回来的
默认值STDOUT.将数据输出到文件句柄时,默认情况下都会经过缓冲处理。不过,只要将特殊变量
$|设定为1,就会使用当前的默认文件句柄每次在进行输出操作后立刻刷新缓冲区。

select LOG;
$=1;
#......
print LOG "test test\n";

-7------------------------------------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  标准