Perl输出带颜色行号或普通输出行

那年仲夏 提交于 2020-04-13 15:54:00

【今日推荐】:为什么一到面试就懵逼!>>>

定义好了一个可以输出带颜色行号以及行数据的函数print_with_line_num,f()是测试函数。在f()函数中,读取文件并输出读取的每一行数据,但根据参数选项决定是普通输出行还是同时输出带颜色行号的行数据。

这可以当作是偏函数、闭包、作用域的一个用法示例。

脚本内容如下:

#!/usr/bin/perl -w

use strict;
use 5.010;


# print string with colored line_num
# arg1: line num
# arg2: string to print
sub print_with_line_num {
    eval 'use Term::ANSIColor';

    my $line_num = shift;
    my $string = shift;

    my $color = 'bold yellow';

    print colored($line_num, $color), ":", "$string";
}


# test function
# arg1: filename for read and print
# arg2: a bool to control whether print line num
sub f {
    my $filename = shift;

    # arg: print_line_num or not?(bool)
    my $print_line_num = shift;

    # initialize line_num
    my $line_num = 1;

    # define a printer, according to the bool of print_line_num,
    # choose how to print string
    my $myprinter;
    {
        if($print_line_num){
            # print line num
            # specify the arg1 to line_num
            $myprinter = sub { print_with_line_num "$line_num", @_; }
        } else {
            # don't print line num,
            # so make a simple wrapper for builtin print function
            $myprinter = sub { print @_; };
        }
    }

    open my $fh, "$filename" or die "open failed: $!";
    while(<$fh>){
        $myprinter->($_);
        $line_num++;
    }
}

if ($ARGV[0] eq "-n"){
    f($ARGV[1], 1);   # print every line with colored line num
} else {
    f($ARGV[0]);      # print every line normally
}

下面是测试效果:

普通输出/etc/hosts文件行:

输出带颜色行号的/etc/hosts文件行:

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!