骏马金龙

网名骏马金龙,钟情于IT世界里的各种原理和实现机制,强迫症重症患者。爱研究、爱翻译、爱分享。特借此一亩三分田记录自己成长点滴!!!
我本问道人,道心不坚,必将与道无缘!

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

定义好了一个可以输出带颜色行号以及行数据的函数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文件行:

posted @ 2019-04-29 17:33 骏马金龙 阅读(...) 评论(...) 编辑 收藏