简短的perl程序能够实现大功能。 perl是如何做到的呢? 1. 默认变量 如果没有向函数提供参数值,则默认参数为$_; 如果没有变量用于接收一个表达式的值,则默认接收变量为$_。 perl语言每条语句可像管道那样运行,通过默认变量$_串接起来。 2. 特殊语法 利用一些正常情况下没有含义的语法,如while(<>){}. 如果按照正常的语法,这个定法的意义是:读取一行文本,然后丢弃。 由于正常情况下没有人会这么用,perl语言将这一语法利用起来了。在实际中写起来非常方便。 3. 变量值不用给定初值,不用提前声明 perl会自动为变量选择合适的初值,如果没有给定的话。 对于数值,初值为0;对于字符串,初值为““,也就是空字符串。 4. 对于一些常用语法的简洁写法 如通过qw定义一个字符串list,可避免写引号。 简短的好处? 简短,再加上perl与shell结合非常好,可以在命令行上直接写出简短又功能强大的代码。 一个常用用法:
代码语言:javascript复制find . |perl -e 'while(<>){...}'
处理标准输入的每一行文本。'...'表示每行的处理代码。 通过动态声明一个函数,省略while,只提供每行的处理代码,可以进一步节省字节。 process_each_line.pl
代码语言:javascript复制#!/usr/bin/perl
my $cmd=$ARGV[0];
my $func = eval "sub{while(<STDIN>){chomp;$cmd;}}";
die "unable to compile '$cmd', aborting...n" if not defined $func;
$func->();
命令行调用
代码语言:javascript复制find . |./process_each_line.pl 'print if /pl$/'
打印出当前目录下所有以pl结尾的文件名。 process_each_line.pl 会生成一个函数 sub{while (<STDIN>){chomp; print if /pl$/;}}(第3行),然后再调用这个函数(最后一行)。 可继续扩充这个文件,加入一些常用函数,供在命令行上直接调用。