Perl

来自百合仙子's Wiki
跳转到导航 跳转到搜索

正则表达式

写法

字母 m 后接由匹配的分隔符括起来的字符串。分隔符是 / 时 m 可以省略。正则字符串与普通的字符串一样内部会进行变量替换。默认对 $_ 进行匹配,使用 $val =~ /re/ 的形式来处理其他来源的字符串。

使用 s/// 形式来进行替换。如果使用配对的字符作为分隔符,那么需要连续使用两对(不一定相同)。它会修改被匹配的变量,默认为 $_ 。返回布尔值。

后向引用使用 \ 前缀而在进行匹配后使用 $n 的形式引用子匹配。没有匹配到的部分为空串。不支持 $0

标志

i
忽略大小写
s
点号 . 匹配换行符
x
忽略空格字符以及注释(注释中不能有闭分隔符)
g
全局匹配(m)或替换(s)

示例

print "Please answer 'yes' or 'no': ";
chomp($_ = <STDIN>);
if(/yes/i) { #大小写无关
  # do something
}

特殊变量

$^I
备份文件后缀。默认为 undef (不写回)。设为空串则不创建备份
$ARGV
<> 目前正在处理的文件名(标准输入为 -
$`$'
被正则抓到部分之前和之后的文本
$<
用户 ID(UID)
$/
声明一个局部的 $/ (值为 undef )将导致 <FHANDLE> 读取整个文件的内容

时间和日期

time
返回 UNIX 时间戳
gettimeofday
类似 C 语言中者。在 Time::HiRes 包中
#!/usr/bin/perl

use Time::HiRes qw(gettimeofday);

sub gettime {
  my ($sec, $usec) = gettimeofday;
  $sec * 1000_100 + $usec;
}

my $times = 100;
my $start = gettime;
for(my $var = 0; $var < $times; $var++){
  `$ARGV[0]`;
}
my $end = gettime;
printf "%lfus\n", ($end - $start) / $times;

命令行用法

[1]

取代sed

perl -pi -e 's/regex/replacement/g' #相当于 sed -i 's/regex/replacement/g'

取代awk

使用 -a 参数使得 @F 为每行的数据。默认按空白分割,使用 -F 来指定其它分隔符。

perl -F: -ane 'print $F[5],"\n" if $F[0] eq getlogin;' /etc/passwd

工具脚本

  • rename, perl-renameArch下),批量文件重命名
  • show_all_colorsArchperl-term-extendedcolor 软件包),显示终端色彩
  • psh, Perl 的交互式命令行(不支持 readline

外部链接

参考资料