headermask image

header image

3 Tips in Perl Programming

1. 获取当前时间
Perl 有一个函数 localtime 可以用来实现这个功能。在具体使用的过程中需要注意的是,它返回的月份数值是以 0 为基准的,而年份数值是在减掉 1900 之后的值,所以很多时候都需要进行相应的调整:

# construct log file name
my ($sec, $min, $hour, $day, $month, $year) = (localtime) [0, 1, 2, 3, 4, 5];
$month = $month + 1;
$year = $year + 1900;
 
my $local_node;
$local_node = qx{hostname};
chomp $local_node;
 
my $filename = sprintf("%04d%02d%02d%02d%02d%02d", $year, $month, $day, $hour, $min, $sec);
$filename = "kill_crsd_" . $local_node . "_" . $filename . ".log";
my $KILL_CRSD_LOG = catfile(curdir(), $filename);

2. 一个写日志文件的函数
经常跑一些小脚本去循环做一些破坏性测试,由于有些操作具有重启节点的潜在可能性,所以这样一个需求也就随之而来。下面就是一个我用来写日志文件的函数的实现:

#
# Write trace file
#
# trace(@content)
#
sub trace(@)
{
    my ($sec, $min, $hour, $day, $month, $year) = (localtime) [0, 1, 2, 3, 4, 5];
    $month = $month + 1;
    $year = $year + 1900;
 
    open(LOGFILE, ">>$KILL_CRSD_LOG") or die "ERROR: Can't open $KILL_CRSD_LOG: $!";
    printf LOGFILE "%04d-%02d-%02d %02d:%02d:%02d: @_\n", $year, $month, $day, $hour, $min, $sec;
    close (LOGFILE);
}

有了这样一个函数之后,可以在进行某个操作之前调用它来记录一下,这样就不怕因为节点重启而丢失脚本的运行信息了。

3. 高于秒级精度的休眠
要让脚本休眠一段时间,我常用的是 Perl 中的 sleep 函数,但是遇到需要进行高于秒级精度的休眠时,这个函数就无能为力了。这时可以使用 select 操作符来实现:

select undef, undef, undef, 4.75;

上面的语句将使你的脚本休眠 4.75 秒。

If you liked my post, feel free to subscribe to my rss feeds

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*