定义好了一个能够输出带颜色行号以及行数据的函数print_with_line_num,f()是测试函数。在f()函数中,读取文件并输出读取的每一行数据,但根据参数选项决定是普通输出行仍是同时输出带颜色行号的行数据。闭包
这能够看成是偏函数、闭包、做用域的一个用法示例。app
脚本内容以下:函数
#!/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文件行:ui
输出带颜色行号的/etc/hosts文件行:code