DDR爱好者之家 Design By 杰米

工作中的线上环境有很多的perl命令行的类似一句话的命令,今天总结下perl的命令行编程的一些东西。

-e 后面紧跟着引号里面的字符串是要执行的命令:
复制代码 代码如下:
king@king:~$ perl -e ‘print “hello world \n”‘
hello world

如果是多个命令就可以使用多个-e,这里是不是想到了sed呢?但是要注意的是中间的哪个“;”.
复制代码 代码如下:
king@king:~$ perl -e ‘print “hello world \n” ;' -e ‘print “my first perl command line script \n”‘
hello world
my first perl command line script

-M 导入要使用的模块:
复制代码 代码如下:
king@king:~$ perl -MLWP::Simple -e'print head “http://www.chinacache.com”,”\n”‘
text/html; charset=utf-81337525116978307200Apache/2.2.3 (CentOS)

另外-M可以判断某个模块是不是已经安装了

-m 的功能和-M类似,区别在于-M 模块名等同于use 模块名,这样会把一些默认的函数或者其它东西引进过来,-m 模块名 则会关闭这些默认值,这样可以引入一些你只使用的函数;例如上面的例子:

换成-m的话就不会有任何输出;-m 和 -M 通过 = 来引入某个模块的特别函数.
复制代码 代码如下:
perl -MCGI='header,start_html' -e ‘print header, start_html'

-w 等同于use warnings
-n -p 都会使用 <> 将所有 @ARGV 参数当作文件来逐行运行(有循环的意思哦,经常和其它参数一起处理文件),会将读入的内容隐式的逐一按行来遍历文件.每一行将缺省保存在 $_;但-p 会将内容“重复”打印出来,而-n更倾向与打印满足某种条件的行(这这里还有一些有用的变量比如$. 表示当前行的行数):
复制代码 代码如下:
king@king:~$ cat file.txt
A 1
B 2
C 3
king@king:~$ perl -p -e ‘print ‘ file.txt
A 1
A 1
B 2
B 2
C 3
C 3
king@king:~$ perl -n -e ‘print ‘ file.txt
A 1
B 2
C 3

看到这里是不是想到了sed的-n 的特性:
复制代码 代码如下:
king@king:~$ sed -ne ‘p' file.txt
A 1
B 2
C 3
king@king:~$ sed -e ‘p' file.txt
A 1
A 1
B 2
B 2
C 3
C 3

-i 将修改直接的写入文件,这个和sed也是一样的哦;
复制代码 代码如下:
king@king:~$ cat file.txt
A 1
B 2
C 3
king@king:~$ perl -pi -e ‘s/A/a/' file.txt
king@king:~$ cat file.txt
a 1
B 2
C 3

-a 打开自动分离 (split)  模式. 空格是缺省的分离号. 输入根据分离号被分离然后放入缺省数组 @F.
复制代码 代码如下:
king@king:~$ perl -na -e ‘print $F[1],”\n”‘ file.txt
1
2
3

和awk是不是很像?还有更像的,那就是-F,和awk一样更改字段之间的分割符,默认是空格和tab;
复制代码 代码如下:
king@king:~$ perl -F':' -alne ‘print $F[0],” “,$F[-1] if /bash$/' /etc/passwd
root /bin/bash
king /bin/bash
guest-b0SIey /bin/bash

看到上面的那个-l的参数没?它的最主要的作用就是chomp字段和在每个输出的后面加上“\n”,让输出换行;是不是挺有用的呢?

有没有其它和awk有类似的地方呢?答案是肯定的,

BEGIN{},END{} 是不是也很熟悉呢?

以下是一些常用的简单实例

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

#perl -ne ‘print if /^aaaaa/' 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 给文件中的内容反向排序,比如文件中有abc,就会变成cba

DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。