Perl健忘录

作者: JavasBoy 分类: Perl 发布时间: 2012-11-29 16:05 ė16,446 views 6没有评论

perl -lne 的作用
-l: line-ending handling Automatically adds or removes '\n' (处理行结束符,自动加上 \n 换行或者删除 \n 换行)

In effect(作用效果):
chomp()s everything on input 自动 chomp 输入分隔号
A godsend for one-liners

perl    [ -sTtuUWX ]
[ -hv ] [ -V[:configvar] ]
[ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ]
[ -pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ]
[ -Idir ] [ -m[-]module ] [ -M[-]'module...' ] [ -f ]
[ -C [number/list] ]
[ -P ]
[ -S ]
[ -x[dir] ]
[ -i[extension] ]
[ [-e|-E] 'command' ] [ -- ] [ programfile ] [ argument ]...

-n
代表遍历文件的内容,使 Perl 隐式地循环遍历指定的文件,并只打印规定的行。

-e
代表执行 perl 命令,一般 -e 后面接 'command' 要执行的命令了,参数的顺序有时候也要注意的,我现在认为 -e 一般紧接着要执行的命令,所以 -e 作为最后一个参数放在那里。

-p
使 Perl 隐式地循环遍历指定的文件,同时打印所有的行。

-P
使要运行的脚本在 Perl 编译之前通过 C 预处理程序。

请注意:-p 开关和 -n 开关的使用。当您想显式打印数据时,使用 -n 开关。-p 开关隐式地将 print $_ 语句插入到 -n 开关所产生的循环中。因此,-p 开关更适用于对文件进行的完全处理,而 -n 开关更适用于选择性文件处理,这样的处理只需打印特定数据。

我现在喜欢使用 -l 参数,用来给每一个输出加 \n. 例如

$ perl -le 'print "Hello World!"'

常用的 Perl 单行实例

perl -pi -e's/aaa/bbb/' filename
修改当前 file 文件中的文件,不生成中间文件,速度很快.记住 -i 开关,因为它让你原地编辑文件。

perl -ne 'print if /^int/' filename
象 grep 一样过滤文件中需要的内容。这个地方,使用了 -n,所以一次是做一行的操作,直到整个文件读完。另外,在管道时,-n 也会一样,来遍历管道送过来的内容。

perl -n -e 'print "$. - $_"' filename
这个例子中的,没用 -ne,只是命令写成了 -n -e,其实一样,这个例子中,是给当前文件中的内容都加一个行号打印出来.注:$.表示当前行号。

perl -pe '$_ = "$. $_"' filename
这个其实和上面一样,分别只是使用了 -p 替换了 -n,这个有个什么好处啦,别的地方都一样,但 -p 按行来遍历完文件后,会给 $_ 打印出来。大家还记得 awk 分割域(awk‘{i = NF – 1; print $1 + $i}’),是不是很方便,下面我们来看看 perl

perl -lane 'print $F[0] + $F[-2]'
这个神奇的地方在于 -a,使用 -a 后.因为 -n 分行读进来,然后 -a 给数据分割成 @F 的数组。

perl -ne 'print if /^START$/ .. /^END$/'
打印正则中从 $start 到 $end 的地方

perl -ne 'print if $. >= 15; exit if $. >= 17;'
有效地打印数字范围中的行

perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c
原地修改 -i 开关的神奇之处在于它对 @ARGV 中的每个文件都用该脚本对该文件输出所产生的文件版本进行替代。

perl -ne 'print scalar reverse $_' test
给文件中的内容反向排序,比如文件中有 fukai,就会变成 iakuf.

替换

将所有 C 程序中的 foo 替换成 bar,旧文件备份成 .bak
perl -p -i.bak -e 's/\bfoo\b/bar/g' *.c

很强大的功能,特别是在大程序中做重构。记得只有在 UltraEdit 用过。如果你不想备份,就直接写成 perl -p -i -e 或者更简单 perl -pie

将每个文件中出现的数值都加一
perl -i.bak -pe 's/(\d+)/ 1 + $1 /ge' file1 file2 ....

将换行符 \r\n 替换成 \n
perl -p -i -e 's/\r\n/\n/g' file
同 dos2unix 命令。

将换行符 \n 替换成 \r\n
perl -pie 's/\n/\r\n/g' file
同 unix2dos 命令。

取出文件的一部分
显示字段 0-4 和字段 6,字段的分隔符是空格
perl -lane 'print "@F[0..4] $F[6]"' file
同 awk 'print $1, $2, $3, $4, $5, $7'。参数名称 lane 也很好记。

如果字段分隔符不是空格而是冒号,则用
perl -F: -lane 'print "@F[0..4]\n"' /etc/passwd

显示

显示 START 和 END 之间的部分
perl -ne 'print if /^START$/ .. /^END$/' file

相反,不显示 START 和 END 之间的部分
perl -ne 'print unless /^START$/ .. /^END$/' file

显示开头 50 行:
perl -pe 'exit if $. > 50' file
同命令 head -n 50

不显示开头 10 行:
perl -ne 'print unless 1 .. 10' file

显示 15 行到 17 行:
perl -ne 'print if 15 .. 17' file

每行取前 80 个字符:
perl -lne 'print substr($_, 0, 80) = ""' file

每行丢弃前 10 个字符:
perl -lne 'print substr($_, 10) = ""' file

搜索

查找 comment 字符串:
perl -ne 'print if /comment/' duptext
这个就是普通的 grep 命令了。

查找不含 comment 字符串的行:
perl -ne 'print unless /comment/' duptext
反向的 grep,即 grep -v。

查找包含 comment 或 apple 的行:
perl -ne 'print if /comment/ || /apple/' duptext
相同的功能就要用到 egrep 了,语法比较复杂……

计算
计算字段 4 和倒数第二字段之和:
perl -lane 'print $F[4] + $F[-2]'
要是用 awk,就得写成 awk '{i=NF-1;print $5+$i}'

排序和反转
文件按行排序:
perl -e 'print sort ' file
相当于简单的 sort 命令。

文件按段落排序:
perl -00 -e 'print sort ' file

多个文件按文件内容排序,并返回合并后的文件:
perl -0777 -e 'print sort ' file1 file2

文件按行反转:
perl -e 'print reverse ' file1

相应的命令有吗?有,tac( cat 的反转)

<strong>数值计算</strong>

110 进制转 16 进制:
perl -ne 'printf "%x\n",$_'

10 进制转 8 进制:
perl -ne 'printf "%o\n",$_'

16 进制转 10 进制:
perl -ne 'print hex($_)."\n"'

8 进制转 10 进制:
perl -ne 'print oct($_)."\n"'

简易计算器。
perl -ne 'print eval($_)."\n"'

其他

启动交互式perl:
perl -de 1

查看包含路径的内容:
perl -le 'print for @INC'

备注
与 One-Liner 相关的 Perl 命令行参数:
-0
(用 8 进制表示)指定记录分隔符( $/ 变量),默认为换行
-00
段落模式,即以连续换行为分隔符
-0777
禁用分隔符,即将整个文件作为一个记录
-a
自动分隔模式,用空格分隔 $_ 并保存到 @F 中。相当于 @F = split ''。分隔符可以使用 -F 参数指定

-F
指定 -a 的分隔符,可以使用正则表达式

-e
执行指定的脚本。

-i
原地替换文件,并将旧文件用指定的扩展名备份,不指定扩展名则不备份

-l
对输入内容自动 chomp,对输出内容自动添加换行

-n
自动循环,相当于 while() { 脚本; }

-p
自动循环 + 自动输出,相当于 while() { 脚本; print; }

A Field Guide To The Perl Command Line PDF
command-line-options

http://perl101.org/command-line-switches.html

本文出自 刘荣星的博客,转载时请注明出处及相应链接。

本文永久链接: https://www.liurongxing.com/perl-recorded.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Ɣ回顶部