zoukankan      html  css  js  c++  java
  • perl学习(5) 输入和输出

    1.1. 从标准输入设备输入

    <STDIN>

    行输入操作在到达文件的结尾时将返回undef在while循环的条件中不能使用chomp

     

    while (defined($line = <STDIN>)) {

           print “I saw $line”;

    }

     

     

    在循环的内部,我们将看到每一行,一行接着一行,perl提供简写:

    while(<STDIN>){

           print “I saw $_”;

    }

    while (defined($_ = <STDIN>)){

           print “I saw $_”;

    }

    两者是等同的

    在进行深入讨论前,我们要澄清一些事:这种简写只在特定的情况下有效,默认的情况下不会将一行读入变量$_。仅当while循环的条件判断部分只包含行输入操作才有效。

     

    对于foreach用法有些区别:

    foreach(<STDIN>){

           print “I saw $_”;

    }

     

    while 循环中,Perl 读入一行,将它赋给变量,然后进入循环。再回到开头,读入下一行。在foreach 循环中,由于行输入操作在列表的context 中使用,因为foreach 需要一个列表作为其参数。

    这一点影响很多,一次读一行和一次读一个文件差别很大。

    1.2.命令行输入

    参数为要被程序顺序处理的文件名

    尖括号操作(<>)是一种特殊的行输入操作,其输入可由用户选择:

    可以使标准输入,也可以使命令行参数。

     

    while (defined($line = <>)){

           chomp($line);

           print “It was &line that I saw! ”;

    }

    由于这是一种特殊的行输入操作,我们也可以使用前面的相似的简写方法:

    while(<>){

           chomp;

           print “It was $_ that I saw! ”;

    }

    输入结束时,<>将返回undef(同时退出while 循环)

     

    技术上讲,<>从数组@ARGV 中得到调用参数。这个数组是Perl 中的一个特殊数组,其包含调用参数的列表,程序本身的名字存在Perl 的特殊变量$0 中,而非@RAGV

    <>操作查看@argv 来决定使用哪些文件。如果表为空,则使用标准输入流;否则,使用其找到的相应文件。

    在启动程序后,使用<>之前,你还有机会修改@argv 的值。例如,下面程序可以处理3 个指定的文件,无论用户在命令行中输入了什么其它的文件:

    @argv = qw# larry mor curly #; #强制使用这三个文件

    while(<>){

           chomp;

           print “It was $_ that I saw in some stooge-like file! ”;

    }

     

    1.3.标准输出

    1.  print

    通常,需要把程序的输出先缓存起来。将要输出的内容先缓存起来,等到有足够的内容再输入,而非立刻就输出。例如,假设要把输出的内容存入磁盘,如果有一个或两个字符就立刻输出到磁盘中,这将非常缓慢和低效。一般,先将要输出的内容存入一个缓存(buffer)中,当缓存满时,再将其输出。

     

    2.  使用printf 格式化输出

     

    #! /usr/bin/perl

    use strict ;

    use warnings ;

     

    my $int = 10 ;

    my $double = 20.5 ;

    my $float = 30.5e10 ;

    # %g 自动选择

    printf "%g ",$int ;

    printf "%g ",$double ;

    printf "%g ",$float ;

     

    #%d,%x,%o

    printf "%d ",$int ;

    printf "%x ",$int ;

    printf "%o ",$int ;

    # %Nd 十进制整形输出,删除小数部分

    printf "%f ",$double ;

    printf "%d ",$double ;

    #长度和对齐

    printf "%10d ",$int ;

    printf "%-10d ",$int ;

    printf "%-10.3f ",$double ;

     

    #数组

    my @items = qw{item1 item2 item3};

    printf "The items are: ".("%10s "x@items), @items;

     

     

     

     

    1.4.文件输出

    Perl 自身有六个文件句柄:STDINSTDOUTSTDERRDATAARGVARGVOUT

    1.4.1.   文件句柄打开

    open CONFIG, “dino”;        

    open CONFIG, “<dino”;              输入

    open BEDROCK, “>fred”;    输出

    open LOG,“>>logfile”;         追加

     

    open 支持“3 参数”类型:

           open CONFIG, “<”, “dino”;

           open BEDROCK, “>”, $file_name;

           open LOG, “>>”, &logfile_name();

    这种方法的优点是Perl 不会将模式(第二个参数)和文件的名字(第三个参数)混淆,这能增加安全性

     

    打开时,可能出现因为文件不存在&权限等问题,句柄bad情况。

    1.  如果从一个bad 文件句柄读入(文件句柄没有恰当的打开),会立刻到达文件结尾(end-of-file)

    2.  如果写到一个bad 文件句柄,数据会被悄悄地丢掉

    使用句柄时需要判断:

    my $success = open LOG, “>>logifle”; #将返回值保存在$success

    if(!$success){

           #打开失败时

    ...

    }

     

    1.4.2.   关闭句柄

    close 句柄名 ;

    当关闭文件句柄时,Perl 将告诉操作系统已经结束了对此数据流的操作,因此应当将输出的数据写到磁盘中.

    如果程序重新打开它(也就是说,使用open 重新打开此文件句柄),或者退出程序,Perl 将自动关闭文件句柄.

     

    1.4.3.   使用句柄

    1.       输入句柄

    if(! open PASSWD, “/etc/passwd”){

           die “How did you get logged in?($!)”;

    }

    while(<PASSWD>){

           chomp;

        ...

    }

     

    2.       输出句柄

    写出(>)或追加的(>>)的文件句柄

    可以和print printf 结合使用

    printf (STDERR “%d percent complete. ”, $done/$total * 100);

    printf STDERR (“%d percent complete. ”, $done/$total * 100);

     

     

    3.  默认句柄

    默认情况下,如果不指定文件句柄给print(或者printf,这里的内容对两者均适用),则默认会使用STDOUT。但这个默认属性,可以通过select 操作进行更改。

     

    1.4.4.   实例

    #! /usr/bin/perl

    #######################

    #读文件加行号写入新文件

    #######################

    use strict ;

    use warnings ;

     

    my $format = __FILE__ . "-" . __LINE__ . ": %s";

    if(!open LOG ,">>", "./log.20130911")

    {

        die "open log.20130911 error:$!" ;

    }

    if(!open SRC ,"< ./find.plx")

    {

        die "open ./find.plx error:$!";

    }

    select LOG ;

    my $line=0 ;

    while(<SRC>)

    {

        chomp ;

        printf "$line" . ": %s" , "$_ " ;

        $line += 1 ;

    }

    close LOG ;

    close SRC ;

     

     

  • 相关阅读:
    job_queue_processes参数讲解
    Oracle trunc()函数的用法
    JSON字符串转JavaBean,net.sf.ezmorph.bean.MorphDynaBean cannot be cast to ……
    javax.swing.JList 设置分割线
    清除SVN版本控制文件
    MyEclipse SVN安装方法
    ExtJs xtype类型介绍
    Android中的“再按一次返回键退出程序”实现
    Android之NetworkOnMainThreadException异常
    HDU 3613 Best Reward
  • 原文地址:https://www.cnblogs.com/james1207/p/3317847.html
Copyright © 2011-2022 走看看