• Perl语言入门笔记 第五章 输入与输出(标准输入输出,文件句柄,printf,die,say)


    =pod
    #第五章 输入与输出
    
     while(defined($line = <STDIN>)) #defined (xxx) xxx为undef则为假,否则为真
     {
        print "I saw $line";
     }
    
    while(<STDIN>) #while是一次读取一行,下次读取会忽略上一行,所以最好写while循环
     {
        print "I saw $_;";
    }
    
    foreach (<STDIN>) #一下全部读出<STDIN>或者是文件内容,然后再一行行分析
     {
        print "I saw $_";
     }
    
    
    while(defined($line = <>)) #钻石操作符,是从命令行得到参数:$perl my_program.pl fred beny good
    {
        chomp($line); #则钻石操作符逐行从fred取出内容,然后,fred读到末尾后,再读beny,good直到读到最后
        print "It was $line that I saw!
    "; #文件名my_program.pl存在于$1中
    }
    
    while(<>)
     {
        chomp;
        print "It was $_ that I saw
    ";
     }
    
    @ARGV = qw#larry moe curly#; #强制让钻石操作符只读取这三个文件
    while(<>)
    {
        chomp;
        print "$_
    ";
    }
    
    print <>; #相当于unix下的cat命令
    print sort <>; #相当于unix下的sort命令
    
     数组和printf函数:
     my @items = qw(wilma dino pebbles);
     my $format = "The items are:
    ".("%10s
    " x @items);
     printf $format, @items;
     printf "The items are:
    ". ("%10s
    " x @items), @items;
     print "
    ";
    
     $cat fred barney | sort | ./your_program | grep something | lpr
    
     $netstat | ./your_program 2>/tmp/my_errors
    
    
     文件句柄:
        open CONFIG, "dino"; #使用文件
        open CONFIG, "<fred"; #只读
        open BEDROCK, ">fred"; #写入,当文件有内容时,就会覆盖原内容
        open LOG, ">>logfile" #追加内容到logfile
    
        my $selected_out = "my_output";
        open LOG, "> $selected_output";
        新版perl 5.6以后,文件句柄的写法:
            open CONFIG, '<', "dino";
            open BEDROCK, ">", $file_name;
            open LOG, '>>', &logfile_name();
            open CONFIG, '<:encoding(UTF-8)', 'dino';
            open BEDROCK, '>:encoding(UTF-8)', $file_name;
            open LOG, '>>:encoding(UTF-8)', &logfile_name();
    
     $% perl -MEncode -le "print for Encode->encodings(':all')"
    
     以二进制方式读写文件句柄:
        binmode STDOUT, ':encoding(UTF-8)';
        binmode STDIN, ':encoding(UTF-8)';
    
     有问题的文件句柄:
        my $success = open LOG, '>>', 'logfile'; #捕获返回值
        if(! $success)
        {
            #open 操作失败
        }
    
     关闭文件句柄:
        close LOG;
    
     用die处理致命错误:
        die函数会输出你指定的信息到专为这类信息准备的标准错误流中,并且让你的程序立即终止并返回不为零的退出码
        if (! open LOG, '>>', 'logfile')
        {
            die 'Cannot create logfile: $!';
        }
    
     自动检测致命错误:
        use autodie;
        open LOG, '>>', 'logfile';
    
     使用文件句柄:
        if(! open PASSWD, "/etc/passwd")
        {
            die "How did you get logged in? ($!)";
        }
        while(<PASSWD>)
        {
            chomp;
        }
    
        print LOG "Captain's log, stardate 3.14159
    "; #输出到文件句柄LOG
        print STDERR "%d percent complete.
    ", $ddone/$total*100;
        句柄和输出之间没逗号,别人说这叫间接对象
    
     改变默认的文件输出句柄:验证并不能使用,在mac os下
        默认情况下,数据时输出到STDOUT的,即输出到屏幕,可以通过select函数可以选择输出方向
        select LOG;
        $| = 1; #特殊变量$|设定为1,就会使当前的默认文件句柄在每次进行输出后立即刷新到缓冲区,所以如果要让输出的内容立即显示:
            select LOG;
            $| = 1; #不要讲LOG的内容保留在缓冲区,但是怎么没什么用
            select STDOUT;
            #.........
            print LOG "This gets written to the LOG at once!
    ";
    
     重新打开标准文件句柄:
        #将错误信息写到我自己的错误日志中
        if(! open STDERR, ">> /home/barney/.error_log")
        {
            die "Can't open error log for append: $_";
        }
    
     say函数:
        会在输出的时候在最后加上
    ,但是需要加上use 5.010;
        $str = "hello world";
        say "$str";
    
     标量变量中的文件句柄:
        从perl5.6开始,已经可以把文件句柄放到标量变量中,而不必非得使用裸字,这样文件句柄就可以作为子程序的参数传递,或者放在数组,哈希表中排序或者严格控制它的作用域,但是写些应急的短小脚本,用裸字更快捷,没必要使用变量存储文件句柄。
        my $rocks_fh;
        open $rocks_fh, '<', '$rocks.txt'
            or die "Could not open rocks.txt: $!";
        防止误用:
            print {$rock_fh}; #默认打印$_中的内容
            print {$rocks[0]} "sandstone
    ";
    =cut
    
    #!/usr/bin/perl -w
    use utf8;
    #use diagnostics;
    #use strict;
    
    print "hello
    ";
    print "world
    ";
    print "program name is $1
    ";
    
    while(<>) #运行程序时,perl my_program file file1
    {
        chomp;
        print "$_
    ";
    }
    
    my @strArray = ("hello
    ", "world
    ", "zys
    ");
    print @strArray, "
    ";
    print "@strArray";
    
    my @items = qw(wilma dino pebbles);
    my $format = "The items are:
    ".("%10s
    " x @items);
    printf $format, @items;
    printf "The items are:
    ". ("%10s
    " x @items), @items;
    print "
    ";


    简单练习:

    #!/usr/bin/perl -w
    use strict;
    use diagnostic;
    =pod
     #ex5_1
    print reverse <>; #<>钻石操作符会依次存储文件中的内容翻转后输出
    #运行时 perl filename.pl file1 file2 file3
    =cut
    
    =pod
    print "Enter some lines, then press Ctrl-D:
    "; #或者是Ctrl-Z
    chomp(my @lines = <STDIN>);
    
    print "1234567890" x 7, "12345
    "; #标尺行,到第75个字符的地方
    
    foreach (@lines)
    {
        print "%20s
    ", $_;
    }
    
    my $format = "%20s
    " x @lines;
    printf $format, @lines;
    =cut
    
    print "What column width would you like?"
    chomp(my $width = <STDIN>);
    print "Enter some lines, then press Ctrl-D:
    ";#或者Ctrl-z
    chomp(my @lines = <STDIN>);
    
    print "1234567890" x (($width+9)/10), "
    "; #长度按需变化的标尺行
    
    foreach(@lines)
    {
        printf "%${width}s
    ", $_;
    }
    
    
    #printf "%*s
    ", $width, $_; #*号会被$width代替



  • 相关阅读:
    Dubbo之SPI实现原理详解
    Java SPI详解
    Java是如何实现自己的SPI机制的
    Dubbo的负载均衡原理解析
    Dubbo公开课
    【todo】什么是沟子函数
    一步一图,带你走进 Netty 的世界!
    https://github.com/xiaojiaqi/k8seasy_release_page
    mysql 8.0导致5.6数据后 :ERROR 1449 (HY000): The user specified as a definer ('mysql.infoschema'@'localhost') does not exist
    Ansible 日常使用技巧
  • 原文地址:https://www.cnblogs.com/v-BigdoG-v/p/7398619.html
Copyright © 2020-2023  润新知