单行Perl

Table of Contents

Perl尤其擅长用一行代码来解决问题。

首先学习几个perl命令的参数,并牢记。:

-a:分割行,并保存到@F变量中

-i:结果直接替换当前文件,如果要备份原始文件,就在-i后面直接跟上扩展名,如-ibak

-n:逐行处理文件

-p:类似-n,但会打印每一行

-e:执行的Perl代码

-l:打印时添加换行符(就不用显示在代码中增加\n了)

替换字符串,将root替换为ROOT:

$ perl -pe 's/root/ROOT/g' /etc/passwd

打印匹配到行,类似grep:

perl -ne 'print if /nologin/' /etc/passwd

打印“oo”出现两次以上的行:

$ perl -ne 'print if (s/oo/oo/g >= 3)' /etc/passwd
root:x:0:0:root:/root:/bin/bash

打印行号:

$.保存了当前的行号。

$ perl -pe 'print "$. "' /etc/passwd

按列打印:

$ perl -F':' -ale 'print @F[0]' /etc/passd

注:参数-F指定分割符

1 BEGIN和END块

前面介绍的单行代码,对每一行输入都会执行一次,有时有些代码只需要执行一次,比如初始化了某个变量或者示例。

例,取域名列表文件的二级域:

$ perl -MDomain::PublicSuffix -nle 'BEGIN{$s = Domain::PublicSuffix->new();}; $d = $s->get_root_domain($_); print $d if $d' all_domain

因为Domain::PublicSuffix->new()只需要执行一次,所以放到了BEGIN代码块中。

END代码块是在读取文件完之后才执行,一般使用在统计场景中。