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

本文介绍了一个使用Perl编写的脚本,该脚本能够读取文件内容,并根据参数选择是否输出带有颜色行号的数据。通过定义函数print_with_line_num实现行号和字符串的彩色输出,以及测试函数f来展示不同输出方式的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

733013-20190429173805171-1776517925.png

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

733013-20190429173847567-673420730.png

转载于:https://www.cnblogs.com/f-ck-need-u/p/10791792.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值